为什么Moq会在"模拟至少一次"上投掷"预期的调用".它被设置为一次,即使它被设置为null?

Moh*_*hit 6 c# nunit unit-testing moq

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

TestCase'MoqTest.TryClassTest.IsMessageNotNull
'
失败:Moq.MockException:
模拟上的预期调用至少一次,
但从未执行过:v => v.Model
= It.Is(value(Moq.It + <> c__DisplayClass2 1 mock, Action 1.VerifySet(Action`1 setterExpression)Class1.cs( 22,0 ):at MoqTest.TryClassTest.IsMessageNotNull() 1[MoqTest.GenInfo]).match)
at
Moq.Mock.ThrowVerifyException(IProxyCall
expected, Expression expression, Times
times, Int32 callCount) at
Moq.Mock.VerifyCalls(Interceptor
targetInterceptor, MethodCall
expected, Expression expression, Times
times) at
Moq.Mock.VerifySet[T](Mock

1 setterExpression, Times
times, String failMessage) at
Moq.Mock


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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你换一行

mockView.VerifySet(v => v.Model = It.Is<GenInfo>(x => x != null));
Run Code Online (Sandbox Code Playgroud)

mockView.VerifySet(v => v.Model, Times.AtLeastOnce());    
Run Code Online (Sandbox Code Playgroud)

它工作正常.

我认为异常是不正确的.

Eri*_*ing 6

您正在使用以下VerifySet断言:

mockView.VerifySet(v => v.Model = It.Is<GenInfo>(x => x != null));
Run Code Online (Sandbox Code Playgroud)

它基本上说"验证我使用一些非空的GenInfo对象设置Model属性".

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

this.view.Model = null;
Run Code Online (Sandbox Code Playgroud)

当然断言失败了.

在第二个VerifySet断言中

mockView.VerifySet(v => v.Model, Times.AtLeastOnce());
Run Code Online (Sandbox Code Playgroud)

你说"断言Model属性是Set,有什么,至少一次".既然你设置了它(虽然是null),当然断言通过了.

我不认为Moq在这里的行为有任何错误.