2017-04-10 13 views
1

イベントをテストする必要があります。 私はクラスでイベントを起こしますが、私はテストでそれを取得しませんでした。 理由は何ですか? Object_TransferInterruptedEvent1がより新しいものです。 これはデモコードです。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))); 
     } 
    } 
} 

テスト

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"); 
} 
関連する問題