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?


好吧,看起来你在测试的“行为”部分传递了一个名为modelSnowballDto实例

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

上一篇: Moq setup causing null

下一篇: Issue with Unit test Mocking Moq