2010-04-05 14 views
6

Sau đây là mã. tạo một lớp lib thêm ref vào NUnit framework 2.5.3.9345 và Moq.dll 4.0.0.0 và dán đoạn mã sau. Hãy thử chạy nó trên máy tính của tôi nó némTại sao Moq đang ném "Dự kiến ​​yêu cầu trên mô hình ít nhất một lần". Nơi nó đang được thiết lập một lần, mặc dù nó đang được thiết lập để null?

TestCase
'MoqTest.TryClassTest.IsMessageNotNull'
thất bại: Moq.MockException: Dự kiến ​​
gọi trên giả ít nhất một lần,
nhưng không bao giờ được thực hiện: v => v.Model
= It.Is (giá trị (Moq.It + <> c__DisplayClass2 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 giả,
Action 1 setterExpression, Times
times, String failMessage) at
Moq.Mock
1.VerifySet (Action`1
setterExpression) Class1.cs (22, 0): tại
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; } 
    } 
} 

Và nếu bạn thay đổi một dòng

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

để

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

nó hoạt động tốt.

Tôi nghĩ Ngoại lệ không chính xác.

Trả lời

6

Bạn đang sử dụng khẳng định VerifySet sau:

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

mà về cơ bản nói "xác minh rằng tôi Thiết lập thuộc tính mẫu với một số đối tượng GenInfo đó không phải là vô giá trị".

Sau đó, bạn thiết lập thuộc tính mẫu với một đối tượng null:

this.view.Model = null; 

Tất nhiên sự khẳng định thất bại.

Trong giây VerifySet khẳng định của bạn

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

bạn đang nói "khẳng định rằng tài sản Mẫu được Set, với bất cứ điều gì, ít nhất một lần". Vì bạn đã thiết lập nó (mặc dù với một null), tất nhiên xác nhận đã qua.

Tôi không nghĩ có bất kỳ lỗi nào trong hành vi của Moq tại đây.

Các vấn đề liên quan