2017-04-10 4 views
1

Ich muss Ereignis testen. Ich erhebe ein Ereignis in der Klasse, aber ich habe es nicht in meinem Test bekommen. Was ist der Grund? Der Object_TransferInterruptedEvent1 wird neuer ausgeführt. Dies ist ein Democode.So testen Sie Ereignis mit Mock

public class A 
{ 
    public virtual event EventHandler<EventArgs<Tuple<Step, string>>> TransferInterruptedEvent; 

    public void Test() 
    { 
     this.OnEventTransferInterrupted(this.CurrentStep, "Transfer not valid"); 
    } 

    protected void OnEventTransferInterrupted(Step step, string errorMsg) 
    { 
     if (this.TransferInterruptedEvent != null) 
     { 
      this.TransferInterruptedEvent(this,new EventArgs<Tuple<object, string>>(new Tuple<object, string>(step, errorMsg))); 
     } 
    } 
} 

-Test

var mock=new Mock<A>() 
EventArgs<Tuple<S3Server.Step, string>> mess; 
mock.Object.TransferInterruptedEvent += Object_TransferInterruptedEvent1; 
mock.Object.Test(); 

Assert.IsTrue(mess.Value.Item1 == S3Server.Step.TransferValidation); 
Assert.IsTrue(mess.Value.Item2 == "Transfer not valid"); 

private void Object_TransferInterruptedEvent1(object sender, EventArgs<Tuple<object, string>> e) { 
    mess=e; 
} 

Antwort

1

die mock Stellen Sie die Basisklasse aufrufen. durch Einstellung mock.CallBase = true; Dies ermöglicht dem Mock-Framework, das Ereignis-Abonnement zuzuweisen.

[TestMethod] 
public void _MockEvent() { 
    //Arrange 
    var mock = new Mock<A>(); 
    mock.CallBase = true; 
    EventArgs<Tuple<Step, string>> mess = null; 

    mock.Object.TransferInterruptedEvent += delegate(object sender, EventArgs<Tuple<Step, string>> e) { 
     mess = e; 
    }; 

    //Act 
    mock.Object.Test(); 

    //Assert 
    Assert.IsNotNull(mess); 
    Assert.IsTrue(mess.Value.Item1 == Step.TransferValidation); 
    Assert.IsTrue(mess.Value.Item2 == "Transfer not valid"); 
}