问题描述
我正在使用 c#、Nunit 和 Moq,我想测试像 Remove() 方法这样的方法,该方法使用 Action 参数调用另一个方法。
public class Db
{
private readonly IMessageWrapper _messageWrapper;
private readonly IProvider _provider;
public Db(IMessageWrapper messageWrapper,IProvider provider)
{
_messageWrapper = messageWrapper;
_provider = provider;
}
public void Remove()
{
Execute(transaction =>
{
// Do something
// method to verify with unit test
_messageWrapper.SendData();
});
}
private void Execute(Action<sqlTransaction> action)
{
_provider.ExecuteAction(action);
}
}
我想做类似的事情:
public class DbTest
{
[Test]
public void Remove_Should_SendData()
{
//... create IMessageWrapper mock and IProvider mock...
var db = new Db(messageWrapperMock.Object,provider.Object);
provider.Setup(p => p.ExecuteAction(It.IsAny<Action<sqlTransaction>>));
db.Remove();
messageWrapperMock.Verify(m => m.SendData(),Times.Once());
}
}
但它不起作用。单元测试未到达 _messageWrapper.SendData();
感谢您的帮助
解决方法
当您 setup
没有任何代码时 - 该方法什么都不做,但您需要它来调用您的操作。
试试这个:
provider.Setup(p => p.ExecuteAction(It.IsAny<Action<SqlTransaction>>()))
.Callback<Action<SqlTransaction>>(c => c(null));