2010-04-05 16 views
6

A continuación se muestra el código. crea una lib de clase agrega la referencia a NUnit framework 2.5.3.9345 y Moq.dll 4.0.0.0 y pega el siguiente código. Pruebe a ejecutar en mi máquina que lanzaPor qué Moq lanza "Invocación esperada en el simulacro al menos una vez". ¿Dónde, como se establece una vez, a pesar de que se establece en nulo?

TestCase
'MoqTest.TryClassTest.IsMessageNotNull'
fallado: Moq.MockException: Se espera
invocación en el simulacro al menos una vez,
pero nunca se llevó a cabo: v => v.Model
= It.Is (valor (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,
Acción 1 setterExpression, Times
times, String failMessage) at
Moq.Mock
1.VerifySet (Action`1
setterExpression) Class1.cs (22, 0): en
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; } 
    } 
} 

Y si cambia una línea

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

a

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

funciona bien.

Creo que la excepción es incorrecta.

Respuesta

6

Está utilizando la siguiente afirmación VerifySet:

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

que básicamente dice "verificar que establece la propiedad Modelo con algún objeto GenInfo que no es nulo".

A continuación, establezca la propiedad Modelo con un objeto nulo:

this.view.Model = null; 

Por supuesto falla la aserción.

En su segunda afirmación VerifySet

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

que están diciendo "afirmar que la propiedad de modelo se estableció, con cualquier cosa, al menos una vez". Desde que lo configuró (aunque con un valor nulo), por supuesto, la afirmación pasa.

No creo que haya ningún error en el comportamiento de Moq aquí.

Cuestiones relacionadas