2012-08-24 18 views
5

aquí es parte de la implementación del código en la clase padre:¿Cómo se genera un evento en una prueba que usa Moq?

handler.FooUpdateDelegate += FooUpdate(OnFooUpdate); 
protected abstract void OnFooUpdate(ref IBoo boo, string s); 

que tengo en el método de ensayo manejador burlado:

Mock<IHandler> mHandler = mockFactory.Create<IHandler>(); 

Este ...

mHandler.Raise(x => x.FooUpdateDelegate += null, boo, s); 

... no es trabajando. Dice:

System.ArgumentException: No se pudo localizar el evento para adjuntar o separar el método Void set_FooUpdateDelegate (FooUpdate).

Quiero aumentar OnFooUpdate por lo que desencadena el código que se probará en la clase infantil.

Pregunta: ¿Cómo puedo elevar delegado (controlador de evento no común) con Moq?

Si me olvidé por completo del punto, por favor, enséñame.

Respuesta

8

Parece que está tratando de plantear un delegado en lugar de un evento. ¿Es esto así?

¿Está su código a lo largo de las líneas de esto?

public delegate void FooUpdateDelegate(ref int first, string second); 

public class MyClass { 
    public FooUpdateDelegate FooUpdateDelegate { get; set; } 
} 

public class MyWrapperClass { 

    public MyWrapperClass(MyClass myclass) { 
     myclass.FooUpdateDelegate += HandleFooUpdate; 
    } 

    public string Output { get; private set; } 

    private void HandleFooUpdate(ref int i, string s) { 
      Output = s; 
    } 

} 

Si es así, entonces se puede invocar directamente el myClass FooUpdateDelegate al igual que

[TestMethod] 
public void MockingNonStandardDelegate() { 

    var mockMyClass = new Mock<MyClass>(); 
    var wrapper = new MyWrapperClass(mockMyClass.Object); 

    int z = 19; 
    mockMyClass.Object.FooUpdateDelegate(ref z, "ABC"); 

    Assert.AreEqual("ABC", wrapper.Output); 

} 

EDIT: Adición de la versión utilizando la interfaz

public interface IMyClass 
{ 
    FooUpdateDelegate FooUpdateDelegate { get; set; } 
}  

public class MyClass : IMyClass { 
    public FooUpdateDelegate FooUpdateDelegate { get; set; } 
} 

public class MyWrapperClass { 

    public MyWrapperClass(IMyClass myclass) { 
     myclass.FooUpdateDelegate += HandleFooUpdate; 
    } 

    public string Output { get; private set; } 

    private void HandleFooUpdate(ref int i, string s) { 
      Output = s; 
    } 

} 


[TestMethod] 
public void MockingNonStandardDelegate() 
{ 

    var mockMyClass = new Mock<IMyClass>(); 
    // Test fails with a Null Reference exception if we do not set up 
    // the delegate property. 
    // Can also use 
    // mockMyClass.SetupProperty(m => m.FooUpdateDelegate); 

    mockMyClass.SetupAllProperties(); 

    var wrapper = new MyWrapperClass(mockMyClass.Object); 

    int z = 19; 
    mockMyClass.Object.FooUpdateDelegate(ref z, "ABC"); 

    Assert.AreEqual("ABC", wrapper.Output); 

} 
+0

Gran respuesta. Una cosa que mencionaría es que puede que tenga que persistir en la propiedad FooUpdateDelegate, llamando a mockMyClass.SetupAllProperties() – Eternal21

+1

@ Eternal21 El simulacro está utilizando la implementación concreta de la propiedad de MyClass, por lo que funciona bien tal como está. Si nos burláramos de una interfaz (por ejemplo, IMyClass), entonces no habría una implementación concreta y sería necesario configurar la propiedad en el simulacro. – AlanT

+0

Ese fue exactamente mi caso. – Eternal21

Cuestiones relacionadas