2010-04-05 3 views
6

Folgendes ist der Code. Erstellen Sie eine Klasse lib fügen Sie die Referenz zu NUnit Framework 2.5.3.9345 und Moq.dll 4.0.0.0 hinzu und fügen Sie den folgenden Code ein. Versuchen Sie es auf meinem Rechner läuft esWarum Moq "erwartete Invokation auf den Mock mindestens einmal" wirft. Wo wird es einmal gesetzt, obwohl es auf null gesetzt ist?

Testcase
‚MoqTest.TryClassTest.IsMessageNotNull‘
gescheitert wirft: Moq.MockException: Erwartete
Aufruf auf der mock mindestens einmal,
wurde aber nie durchgeführt: v => v.Model
It.Is = (Wert (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 mock,
Aktion 1 setterExpression, Times
times, String failMessage) at
Moq.Mock
1.VerifySet (Action`1
setterExpression) Class1.cs (22, 0): bei
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; } 
    } 
} 

Und wenn Sie eine Zeile ändern

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

zu

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

es funktioniert gut.

Ich denke, Ausnahme ist falsch.

Antwort

6

Sie die folgende VerifySet Behauptung mit:

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

die im Grunde sagt, „sicherzustellen, dass ich die Modell-Eigenschaft mit einigem GenInfo Objekt fest, das nicht null ist“.

Dann setzen Sie das Modell Eigenschaft mit einem Null-Objekt:

this.view.Model = null; 

Natürlich ist die Behauptung fehlschlägt.

In Ihrer zweiten VerifySet Behauptung

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

Sie sagen, "behaupten, dass das Modell Eigentum Set wurde, mit etwas, mindestens einmal". Da Sie es gesetzt haben (wenn auch mit einer Null), ist natürlich die Behauptung bestanden.

Ich glaube nicht, dass hier ein Fehler in Moq Verhalten ist.

Verwandte Themen