Moq设置导致null
我是单元测试和Moq的新手,如果我的方法或理解完全错误,请帮助我。
我有一个我正在测试的逻辑方法。 我已经评论了逻辑,但它所做的只是检查'模型'中的一些值,并在出现问题时返回。 在我们看的情况下,没有问题。
public ReplyDto SaveSettings(SnowballDto model)
{
// Some logic here that reads from the model.
var result = _data.SaveSettings(model);
return result;
}
我的测试使用NUnit和MOQ,如下所示:
_logic = new SnowballLogic(mockSnowballData.Object, mockLog.Object);
mockSnowballData
.Setup(x => x.SaveSettings(SnowballDto_Good))
.Returns(new ReplyDto {
IsSuccess = true,
Message = "Saved",
ReplyKeyID = 1
});
在每个测试中,我都会调用一个私有设置函数来设置我将要使用的东西。
private void SetupData()
{
SnowballDto_Good = new SnowballDto {
FirstPaymentDate = DateTime.UtcNow,
ID = 1,
OrderedIDPriority = new List<int>(),
SnowballTypeID = 1,
TargetPayment = 1000
};
DebtDtoList_ThreeDebt.Clear();
DebtDtoList_ThreeDebt.Add(new DebtDto { ID = 1, Description = "Debt 1", ManualSnowballPriority = 1, MinimumMonthlyPaymentAmount = 140, OpeningBalance = 5000, RunningData = new DebtRunningDto { Balance = 5000 }, OpeningDate = DateTime.UtcNow, SnowballID = 1, StandardRate = 10 });
DebtDtoList_ThreeDebt.Add(new DebtDto { ID = 2, Description = "Debt 2", ManualSnowballPriority = 2, MinimumMonthlyPaymentAmount = 90, OpeningBalance = 1600, RunningData = new DebtRunningDto { Balance = 1600 }, OpeningDate = DateTime.UtcNow, SnowballID = 1, StandardRate = 15 });
DebtDtoList_ThreeDebt.Add(new DebtDto { ID = 3, Description = "Debt 3", ManualSnowballPriority = 3, MinimumMonthlyPaymentAmount = 300, OpeningBalance = 9000, RunningData = new DebtRunningDto { Balance = 9000 }, OpeningDate = DateTime.UtcNow, SnowballID = 1, StandardRate = 20 });
}
所以,我对MOQ的理解是,我说“当调用SnowballData类的”SaveSettings“方法并传入”SnowballDto_Good“对象时,总是返回一个带有IsSuccess = true的新的ReplyDto。
因此,当我打电话时:
var result = _data.SaveSettings(model);
它应该用IsSuccess = true返回ReplyDto
但是,当我在调用“SaveSettings”时放置断点时,它始终返回null。
如果我将设置更改为:
.Setup(x => x.SaveSettings(It.IsAny<SnowballDto>()))
测试通过。 为什么当我给它一个真正的SnowballDto时它会返回null?
好吧,看起来你在测试的“行为”部分传递了一个名为model
的SnowballDto
实例
var result = _data.SaveSettings(model);
但是,在设置moq时,只有当实例SnowballDto_Good
指定为SaveSettings
时,才会将其配置为返回新的ReplyDto
。 在所有其他情况下,该方法的模拟没有配置,并且 - 如果松散模拟策略(默认) - 它将返回SaveSettings
返回类型的默认值。 在这种情况下:null。
当你使用It.IsAny<SnowballDto>
你基本上是告诉moq配置SaveSettings
来返回一个新的实例,不仅然后将实例SnowballDto_Good
传递给它,而是任何这种类型的实例。
你需要做的是改变你的测试的“行为”部分如下:
var result = _data.SaveSettings(SnowballDto_Good);
那么它将与您的原始模拟设置一起工作,因为正确的实例将被传递给SaveSettings
。
这正是我喜欢使用MockBehavior.Strict来实例化我的模拟的原因。
它不会返回null,它会抛出一个异常,它会告诉你,你没有正确配置你的模拟。
希望这可以帮助。
链接地址: http://www.djcxy.com/p/35347.html