2013-11-28 189 views
2

我是Nunit.please幫助編寫測試用例的新手。 這是我的課編寫NUnit測試用例的方法

public CommandModule(ICommandFetcher fetcher,ICommandBus commandBus) 
    { 

     //Get["/"] = p => 
     //{z 
     // return Response.AsText((string)Request.Form.Username); 
     //}; 

     Post["/"] = parameters => 
     { 
      var commandRequest = this.Bind<MessageEnvelope>(); 
      var command = fetcher.FetchFrom(commandRequest); 
      commandBus.Send((ICommand)command, commandRequest.MetaData); 
      return HttpStatusCode.OK; 
     }; 
    } 
} 

,我想測試檢驗這種方法

commandBus.Send((ICommand)command, commandRequest.MetaData); 

謝謝!

我嘗試以下方法

[Test] 
    public void whern_reseiving_command_it_sent_to_the_command_bus() 
    { 

     var rCommand = new DummyCommand() { SomeProp = 2 }; 
     var serializedCommand = JsonConvert.SerializeObject(rCommand); 
     var envelope = new MessageEnvelope() { MetaData = new MetaData() { MessageType = "DummyCommand", MessageTypeVersion = 1 }, MessageData = serializedCommand }; 
     var fakeCommand = A.Fake<ICommandBus>(); 

     var browser = new Browser(with => 
     { 
      with.Module<CommandModule>(); 
      with.Dependency<ICommandBus>(fakeCommand); 

     }); 

     var result = browser.Post("/", with => 
     { 
      with.HttpRequest(); 
      with.JsonBody(envelope); 
     }); 

     A.CallTo(() => fakeCommand.Send(rCommand,envelope.MetaData)).MustHaveHappened(); 

A.CallTo(() => fakeCommand.Send(rCommand,envelope.MetaData)).MustHaveHappened(); 它在r命令值某種錯誤

+0

在編寫函數之前,您應該能夠編寫測試。如果您在編寫測試時遇到困難,您必須質疑您是否真正理解實施的要求。從你的命令開始。發送()並問自己你認爲應該發生什麼。這會導致你寫單元測試。 SO讀者很難提出單元測試,因爲我們不知道你期望發生什麼。 –

+0

感謝您的評論 – user3044294

回答

1

這聽起來像你正在尋找明確的測試ICommandBus.Send被稱爲執行代碼時。

一種方法是模擬ICommandBus依賴關係。也就是說,插入一個實現ICommandBus的模擬對象,該對象能夠檢測是否使用正確的參數值調用該方法。

如果你採取這種方法,你通常會使用模擬框架(例如Moq或RhinoMocks)來完成此操作。

爲了解釋你如何簡單地使用模擬,我將展示如何通過顯式實現一個模擬對象對象來記錄方法調用,然後測試它們。

E.g.

MockCommandBus : ICommandBus 
{ 
    ICommand PassedCommand { get; set; } 
    MetaData PassedMetaData { get; set; } 

    public void Send(ICommand command, MetaData metaData) 
    { 
     this.PassedCommand = command; 
     this.PassedMetaData = metaData; 
    }  
} 

然後你的測試用例看起來就像這樣:

[TestCase] 
public void PostSendsCommandOnBus() 
{ 
    // ARRANGE 
    var mockCommandBus = new MockCommandBus(); 

    ICommand expectedCommand = <whatever you expect>; 
    MetaData expectedMetaData = <whatever you expect>; 

    // Code to construct your CommandModule with mockCommandBus. 

    // ACT 
    // Code to invoke the method being tested. 

    // ASSERT 
    Assert.AreEqual(expectedCommand, mockCommandBus.PassedCommand); 
    Assert.AreEqual(expectedMetaData , mockCommandBus.PassedMetaData); 

} 

警告:

請注意,這只是一個方法,它恰好完全適合單元測試你的要求這裏。過度使用mock來測試與低級依賴關係的顯式交互可能會導致開發非常脆弱的測試套件,這些測試套件正在測試底層實現而不是系統的行爲。

相關問題