代码如下。创建一个类库,将引用添加到 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](Mock
1 mock,
Action1 setterExpression, Times<br/> times, String failMessage) at<br/> Moq.Mock
1.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/