2010-04-05 4 views
6

Poniżej znajduje się kod. utwórz bibliotekę klasy dodaj wzorzec do NUnit framework 2.5.3.9345 i Moq.dll 4.0.0.0 i wklej następujący kod. Spróbuj uruchomić go na moim komputerze rzucaDlaczego Moq rzuca "oczekiwane wywołanie na próbę co najmniej raz". Gdzie jest ustawiany jeden raz, nawet jeśli jest ustawiony na wartość null?

TESTCASE
'MoqTest.TryClassTest.IsMessageNotNull'
failed: Moq.MockException: oczekuje
wezwanie na mock przynajmniej raz,
ale nigdy nie została wykonana: V => v.Model
= It.Is (wartość (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 pośmiewanie
Działanie 1 setterExpression, Times
times, String failMessage) at
Moq.Mock
1.VerifySet (Action`1
setterExpression) Class1.cs (22, 0): co
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; } 
    } 
} 

A jeśli zmienisz jedną linię

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

do

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

to działa dobrze.

Myślę, że wyjątek jest niepoprawny.

Odpowiedz

6

Używasz następujące VerifySet twierdzenie:

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

które zasadniczo mówi „sprawdzić, ustawić właściwość model z jakiegoś przedmiotu GenInfo, która nie jest pusta”.

Następnie należy ustawić właściwość model z pustego obiektu:

this.view.Model = null; 

Oczywiście twierdzenie zawiedzie.

W swoim drugim VerifySet twierdzenie

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

mówisz „twierdzą, że nieruchomość została ustawiona model, z niczego, przynajmniej raz”. Ponieważ zrobiłeś Ustaw (choć z wartością zerową), oczywiście asercja przechodzi.

Nie sądzę, że jest tu jakikolwiek błąd w zachowaniu Moq.

Powiązane problemy