2017-08-09 28 views
0

以下のような構造になっています。 ViewLoadedイベントが発生したときにLoadDataが呼び出されたかどうかをテストします。raiseイベントmoqのアクション

public interface ISetupView 
{ 
    event Action ViewLoaded; 
} 

public class BaseSetupController 
{ 
    private ISetupView view; 

    public BaseSetupController(ISetupView view) 
    { 
     this.view = view; 
     view.ViewLoaded +=() => { LoadData(); }; 
    } 

    public virtual void LoadData() 
    { 

    } 
} 

現在、以下のようなテストがありますが、動作しません。 LoadDataは決して呼び出されません。

[TestFixture] 
public class BaseSetupControllerTests 
{ 
    [Test] 
    public void ViewLoad_LoadDataIsCalled() 
    { 
     Mock<ISetupView> view = new Mock<ISetupView>(); 
     Mock<BaseSetupController> controller = new Mock<BaseSetupController>(view.Object); 
     controller.Setup(x => x.LoadData()); 
     view.Raise(x => x.ViewLoaded +=() => { }); 
     controller.Verify(x=>x.LoadData(), Times.Once()); 
    } 
} 

答えて

0

私がちょうどイベントを上げる前controller.Objectを作成するために必要なようだ:

var obj = controller.Object; 
view.Raise(x=>x.ViewLoaded+=null); 
0

は、イベントハンドラを使用すると、オブジェクトだけをからかっている場合に呼び出されていないコンストラクタで起こるの設定します。

ユニットテストでは、具体的なクラスが1つあります。その依存関係はあなたが嘲笑するものです。 これらの両方をモックすると、基本的にクラスだけでなく、モックフレームワークがテストされます。

LoadDataが呼び出されているかどうかをテストしたいので、イベントハンドラがLoadDataに設定されている場合はおそらく興味があります。イベントが発生したときにLoadDataが実際に呼び出されるのは、.NETフレームワーク自体が疑わしい場合を除いて、与えられたものです。

This question discusses verifying whether an event has a specific subscriber.しかし、それは反射を必要とし、容易ではありません。