c# - 为什么 Moq 抛出 "expected Invocation on the mock at least once"。在哪里设置一次,即使它被设置为空?

标签 c# unit-testing nunit moq

代码如下。创建一个类库,将引用添加到 NUnit 框架 2.5.3.9345 和 Moq.dll 4.0.0.0 并粘贴以下代码。尝试在它抛出的我的机器上运行它

TestCase
'MoqTest.TryClassTest.IsMessageNotNull'
failed: Moq.MockException : Expected
invocation on the mock at least once,
but was never performed: v => v.Model
= It.Is(value(Moq.It+<>c__DisplayClass21[MoqTest.GenInfo]).match)<br/> at<br/> Moq.Mock.ThrowVerifyException(IProxyCall<br/> expected, Expression expression, Times<br/> times, Int32 callCount) at<br/> Moq.Mock.VerifyCalls(Interceptor<br/> targetInterceptor, MethodCall<br/> expected, Expression expression, Times<br/> times) at<br/> Moq.Mock.VerifySet[T](Mock1 mock,
Action1 setterExpression, Times<br/> times, String failMessage) at<br/> Moq.Mock1.VerifySet(Action`1
setterExpression) Class1.cs(22,0): at
MoqTest.TryClassTest.IsMessageNotNull()

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Moq;
using NUnit.Framework;

namespace MoqTest
{
    [TestFixture]
    public class TryClassTest
    {
        [Test]
        public void IsMessageNotNull()
        {
            var mockView = new Mock<IView<GenInfo>>();
            mockView.Setup(v => v.ModuleId).Returns("");

            TryPresenter tryPresenter = new TryPresenter(mockView.Object);
            tryPresenter.SetMessage(new object(), new EventArgs());
            // mockView.VerifySet(v => v.Message, Times.AtLeastOnce());
            mockView.VerifySet(v => v.Model = It.Is<GenInfo>(x => x != null));
        }
    }

    public class TryPresenter
    {
        private IView<GenInfo> view;
        public TryPresenter(IView<GenInfo> view)
        {
            this.view = view;
        }

        public void SetMessage(object sender, EventArgs e)
        {
            this.view.Model = null;
        }
    }

    public class MyView : IView<GenInfo>
    {
        #region Implementation of IView<GenInfo>

        public string ModuleId
        {
            get; set;
        }

        public GenInfo Model
        {
            get; set;
        }

        #endregion
    }

    public interface IView<T>
    {
        string ModuleId { get; set; }
        T Model { get; set; }
    }

    public class GenInfo
    {
        public String Message { get; set; }
    }
}

如果你改变一行

mockView.VerifySet(v => v.Model = It.Is<GenInfo>(x => x != null));

mockView.VerifySet(v => v.Model, Times.AtLeastOnce());    

它工作正常。

我认为异常是不正确的。

最佳答案

您正在使用以下 VerifySet 断言:

mockView.VerifySet(v => v.Model = It.Is<GenInfo>(x => x != null));

这基本上是说“验证我用一些非空的 GenInfo 对象设置了模型属性”。

然后,您使用空对象设置 Model 属性:

this.view.Model = null;

断言当然失败了。

在您的第二个 VerifySet 断言中

mockView.VerifySet(v => v.Model, Times.AtLeastOnce());

您是在说“断言模型属性已设置,任何,至少一次”。由于您确实设置了它(尽管设置为 null),当然断言通过了。

我认为 Moq 在这里的行为没有任何错误。

关于c# - 为什么 Moq 抛出 "expected Invocation on the mock at least once"。在哪里设置一次,即使它被设置为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2581829/

相关文章:

安卓。 @RunWith(AndroidJUnit4.class) - 无法在包 "androidTest"中解析

unit-testing - 使用AsConfigured,仍然能够在TFS中获取UnitTest结果

c# - 如何在 C# 中使用 NUnit 编写 stub 方法

unit-testing - 单元测试 : How to break a local object dependency?

c# - 使用int32.TryParse处理错误

c# - 堆栈溢出 ToArray()

c# - ASP.NET Core 中的模拟 IHttpConnectionFeature

c# - 在使用 NUnit 对 Controller Action 方法进行单元测试时遇到困难

c# - 如何使用CommandParameter发送列表

c# - 表单中不存在的所需实体验证失败?