2009-07-27 11 views
2

コントローラ用のユニットテストをしています。私はビジネスコンポーネントを嘲笑しています。 BCには、コントローラーが構築されたときに私がコントローラーを聴いているという公のイベントがあります。嘲笑されたオブジェクトのイベントを聞くにはどうすればいいですか?

私がいる問題は、私が述べ期待エラーを得続けるです: "IBC.add_MessageRaised(MessageEventHandler)期待#:1実際の#:0"。

しかし、私はテストでそのようなことは期待していません。私はそれが模擬されたオブジェクト(この場合BC)のイベントを聞くためにコントローラを設定することと関係があるのだろうかと思っています。コントローラーにモックからのイベントを聞く別の方法はありますか?

私はMessageRaisedイベントを発生させるモックを得る方法も考えていますが、それはまったく別の質問かもしれません。ここで

はコードです:次のコードは、モックオブジェクトのANを使用しているようだ

ビジネスコンポーネント・インタフェース

public interface IBC 
{ 
    event MessageEventHandler MessageRaised; 
    XmlDocument GetContentXml(string path); 
} 

コントローラ

private readonly IBC _bc; 

public Controller(IBC bc) 
{ 
    _bc = bc; 
    _bc.MessageRaised += MessageWatch; 
} 
private void MessageWatch(object sender, MessageEventArgs e) 
{ 
    if (MessageRaised != null) 
     MessageRaised(sender, e); 
} 

ユニットテスト

MockRepository Mockery = new MockRepository(); 
TFactory _tFac; 
IView _view; 
Presenter _presenter = new Presenter(); 
IBC _bc = Mockery.DynamicMock<IBC>(); 
Controller _controller = new Controller(_bc); 
_tFac = new TFactory(Mockery); 
_tFac.Create(ref _view, ref _presenter, ref _controller); 

[Test] 
public void View_OnGetContentXmlButtonClick_Should_SetXmlInView() 
{ 
    //SETUP 
    XmlDocument xmlDocument = new XmlDocument(); 
    using (Mockery.Record()) 
    { 
     SetupResult.For(_view.FilePath).Return("C:\Test.txt"); 
     Expect.Call(_bc.GetContentXml("C:\Test.txt")).Return(xmlDocument); 
     _view.Xml = xmlDocument.InnerXml; 
    } 

    //EXECUTE 
    using (Mockery.Playback()) 
    { 
     _presenter.View_OnGetContentXmlButtonClick(); 
    } 
} 

答えて

0

は、私はいくつかのことを組み合わせることによって動作するようになった(それがどのように動作するか全くわからないが、それはありません):

IEventRaiser _raiser; 
MockRepository Mockery = new MockRepository(); 
TFactory _tFac; 
IView _view; 
Presenter _presenter = new Presenter(); 
IBC _bc = Mockery.DynamicMock<IBC>(); 
_bc.MessageRaised += null; 
_raiser = LastCall.GetEventRaiser(); 
Controller _controller = new Controller(_bc); 
Mockery.BackToRecord(_bc,BackToRecordOptions.None); 
_tFac = new TFactory(Mockery); 
_tFac.Create(ref _view, ref _presenter, ref _controller); 

は、これが問題の仕事でのテストだけでなく、私が提起させることをしました他のテストのMockオブジェクトからのイベント:

[Test] 
public void View_OnGetContentXmlButtonClick_When_FileDoesNotExist_Should_RelayMessage() 
{ 
    //SETUP 
    XmlDocument xmlDocument = new XmlDocument(); 
    using (Mockery.Record()) 
    { 
     SetupResult.For(_view.FilePath).Return("C:\Test.txt"); 
     Expect.Call(_bc.GetContentXml("C:\Test.txt")).Return(null); 
     _view.Xml = xmlDocument.InnerXml; 
     _view.Message = MESSAGE_FILE_NOT_EXIST; 
    } 

    //EXECUTE 
    using (Mockery.Playback()) 
    { 
     _presenter.View_OnGetContentXmlButtonClick(); 
     _raiser.Raise(_bc, new MessageEventArgs(MESSAGE_FILE_NOT_EXIST)); 
    } 
} 

他にもこのツールが役立ちます。

3

あなたはこのようなモックオブジェクトを使用している

Controller _controller = new Controller(_bc); 

:dは、それを使用することで、期待が記録されます

_bc.MessageRaised += MessageWatch; 

その結果を、あなたは期待が設定されていることをイベントハンドラ_bc.MessageRaisedに追加されます。これは再生ブロックでは発生しないため、エラーが発生します。

this questionも参照してください。オブジェクトがレコード状態になるときです。正直言って、オブジェクトがレコードの状態を暗黙のうちに暗黙に入力すると、明示的なレコード構文がある理由を理解できません。

+0

ありがとうございました!私はBackToRecord()メソッドについて知らなかったので、もう1つの質問はいくつかの助けになりました。 –

0

は、ここで私はモックオブジェクトからイベントを上げるに対処方法は次のとおりです。この場合

 port.DataPacketReceived += null; 
     packetReceivedRaiser = 
      LastCall.IgnoreArguments().Repeat.Any().GetEventRaiser(); 

、ポートはDataPacketReceivedと呼ばれるイベントでモックオブジェクトです。

理想的には、モックオブジェクトを再生モードにしてから、テスト対象のシステムに渡すのが理想です。これにより、「予期しない期待」が回避されます。

関連する問題