2017-04-10 118 views
1

我需要测试事件。 我在课堂上提出了一个事件,但我没有在我的测试中得到它。 是什么原因? Object_TransferInterruptedEvent1更新执行。 这是演示代码。如何使用模拟测试事件

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))); 
     } 
    } 
} 

测试

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; 
} 

回答

1

设置模拟调用基类。通过设置mock.CallBase = true;这将允许模拟框架分配事件订阅。

[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"); 
}