Following is the code. create a class lib add the ref to NUnit framework 2.5.3.9345 and Moq.dll 4.0.0.0 and paste the following code. Try running it on my machine it throws
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) at Moq.Mock.ThrowVerifyException(IProxyCall expected, Expression expressio开发者_开发知识库n, Times times, Int32 callCount) at Moq.Mock.VerifyCalls(Interceptor targetInterceptor, MethodCall expected, Expression expression, Times times) at Moq.Mock.VerifySet[T](Mock
1 mock, Action1 setterExpression, Times times, String failMessage) at 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; }
}
}
And if you change one line
mockView.VerifySet(v => v.Model = It.Is<GenInfo>(x => x != null));
to
mockView.VerifySet(v => v.Model, Times.AtLeastOnce());
it works fine.
I think Exception is incorrect.
You are using the following VerifySet assertion:
mockView.VerifySet(v => v.Model = It.Is<GenInfo>(x => x != null));
which basically says "verify that I Set the Model property with some GenInfo object that's not null".
Then, you set the Model property with a null object:
this.view.Model = null;
Of course the assertion fails.
In your second VerifySet assertion
mockView.VerifySet(v => v.Model, Times.AtLeastOnce());
you are saying "assert that the Model property was Set, with anything, at least once". Since you did Set it (albeit with a null), of course the assertion passes.
I don't think there's any error in Moq's behavior here.
精彩评论