2016-02-29 76 views
1

我需要測試我的課的一個取之有道,我很新的任何嘲弄框架my project structure looks like this起訂量與測試數組類

我有下面的測試類我使用NUnit與起訂量。我很困惑,我應該如何通過一個carconfigs陣列,同時打電話如下。

[TestFixture] 
    public class RaceCarSetupSelectorTest 
    { 
     private CarConfiguration _carConfiguration; 
     private RaceCarSetupSelector _raceTrack; 
     private Mock<IRankCalculator> _mockRankCalcultor;   

     [SetUp] 
     public void SetUp() 
     { 
      _mockRankCalcultor = new Mock<IRankCalculator>(); 
      _raceTrack = new RaceCarSetupSelector(_mockRankCalcultor.Object); 
     } 

     [Test]  
     public void RankingCarConfigurationsTest() 
     { 
      IList<CarConfiguration> carConfigs = new List<CarConfiguration>(); 
      carConfigs.Add(FakeCarConfigs.Bentley); 
      carConfigs.Add(FakeCarConfigs.Jaguar); 
      carConfigs.Add(FakeCarConfigs.Maruti); 
      carConfigs.Add(FakeCarConfigs.Nissan); 
      carConfigs.Add(FakeCarConfigs.Porsche); 

      _mockRankCalcultor.Verify(x=>x.RankConfigurations(It.IsAny<RaceTrack>,It.IsAny<List<CarConfiguration>>)). 

     } 
    } 

基本上我要測試其在IRankCalculator接口中定義的方法RankConfiguration

我有兩個實體RaceTrack和CarConfiguration,我必須根據一些輸入對汽車配置進行排名。我有一個RankCalculator類,其中實際的計算方法如下所示,它來自IRankCalculator接口。

public CarConfiguration[] RankConfigurations(RaceTrack raceTrack, CarConfiguration[] configs) 
     { 
     //code for calculation 

      return configs[]; 

     } 

我有一個叫RaceCarSetupSelector不同的類,它的作用就像它調用了RankCalculator類方法的服務類。所以我寫了一個類'RaceCarSetupSelector'的測試。希望我這次清楚。

+0

究竟你想測試什麼?哪種方法?預期的行爲/產出是什麼? –

+0

你仍然在嘲笑你試圖測試的實際班級(IRankCalculator)。這個類不應該被嘲笑,只是它的依賴。 – andreasnico

+0

我不理解你的評論。你能解釋一下嗎? –

回答

1

基本上我想測試在IRankCalculator接口中定義的RankConfiguration方法。

這意味着被測系統(SUT)是RankCalculator類,你要確保它被正確計算行列。但是,在您的示例代碼中,您沒有使用RankCalculator,而是使用了IRankCalculator的模擬。爲了測試RankCalulator你會做這樣的事情

// Arrange 
var raceTrack = new FakeRaceTrack(); 
var carConfigs = new List<CarConfiguration> {FakeCarConfigs.Bentley, FakeCarConfigs.Jaguar, ...}; 
var rankCalculator = new RankCalculator(); // SUT 

// Act 
var ranks = rankCalculator.RankConfigurations(raceTrack, carConfigs); 

// Assert 
Assert.That(ranks.First(), Is.EqualTo(FakeCarConfigs.Jaguar)); 

它看起來像你正試圖測試RaceCarSetupSelector類,以確保在某些時候它調用RankConfiguration()IRankCalculator(動作驗證)。你幾乎就在那裏,但是你的測試似乎缺少了你試圖測試的實際方法調用。我會想像它應該看起來像

// Arrange 
var raceTrack = new FakeRaceTrack(); 
var carConfigs = new List<CarConfiguration> {FakeCarConfigs.Bentley, FakeCarConfigs.Jaguar, ...}; 
var mockRankCalcultor = new Mock<IRankCalculator>(); 
var setupSelector = new RaceCarSetupSelector(mockRankCalcultor.Object); // SUT 

// Act 
setupSelector.DoSomething(raceTrack, carConfigs); 

// Assert 
mockRankCalcultor.Verify(x => x.RankConfigurations(raceTrack, carConfigs); 
+0

謝謝馬特,這幫了我很多:) –

1

首先是你不想嘲笑被測試的實際類,你想嘲笑它的依賴關係。您需要創建實現您的IRankCalculator的類的具體實例,並期待測試該實例。

然後下一個問題是你想測試什麼樣的方法?