2015-03-03 69 views
-1

我正在學習單元測試,我正在使用Nsubstitute作爲嘲笑框架的選擇。 所以我有這個小虛擬的應用程序,我正在寫一個客棧。我試圖寫 一個測試,以確保一旦預訂是星期五進行,房間價格應該是 打折20%。但我不明白這個Nsubstitute是如何工作的(記住你還在學習),所以我認爲使用when()do()應該幫助我測試我的目標。 有人可以幫我理解Nsubstitute框架的when()do()方法嗎? 我該如何完成這個測試?希望你們都可以幫助!單元測試Nsubstitute

public void DiscountRoomPricesAtWeekends(){ 
    //Arrange 
    //prices at weekends should be discounted by 20% 
    //get price of a particular room and discount price 
    var roomprice = new Rooms() { Price = 100M }; 
    //if day to check in is a friday or saturday its 20% off 
    var reserve = Substitute.For<Reservation>(); 
    //Make sure that the date of reservation is always friday.    
    //reserve.ReservationDate.DayOfWeek.Returns(DayOfWeek.Friday); 
    //(double) roomprice.Price * 0.20) 
    var percentage = (double) roomprice.Price * 0.20; 
    reserve.When(r => r.ReservationDate.DayOfWeek.Returns(DayOfWeek.Friday)) 
      .Do(p =>); 
    //Act 
    //Assert 
    //Assert.AreEqual(percentage, 20); 
    Assert.AreEqual();} 

謝謝大家

+0

那麼,無論誰給了-1都不會得到它。當你正在學習一種新的發展方式時,每個人都從某處開始。無論如何,我意識到對於我提到的場景,我必須以不同的方式運行我的測試。我試圖用我的問題來指出的一點是,Nsubstitute的文檔中的例子在某些領域並不是很有見地。但無論如何,下面的答案有助於提供一些啓示,並提醒我所有關於單元測試的理論。歡呼和上帝保佑 – 2015-03-10 02:17:37

回答

1

我無法從你的例子告訴您要測試的內容。如果您發佈了您正在嘗試測試的代碼,我可能會協助您提供一種測試方法。

在學習單元測試和特別模仿庫方面,我建議先測試一下,不要模擬庫。開始爲你感興趣的類/類組寫一個測試。一路上你可能會發現難以可靠測試的位(它們依賴於當前的日期/時間,數據庫,隨機數,Web請求等) 。處理這個問題的一種方法是將這些棘手的位與正在測試的代碼的其餘部分分離。

的如何可以做到這一點的一些實例是:

  • 傳入可變值代入代碼被測試。例如,不要從GetRoomPrice()內調用DateTime.Now,而要更改代碼以獲取查詢的日期:GetRoomPrice(DateTime bookingDate)
  • 將難以測試的邏輯推到接口後面,然後使用該接口的假實現來進行測試。例如,如果GetAvailableRooms()需要訪問數據庫,則可以創建一個RoomLookup類/接口,並將其傳遞到正在測試的類中。對於測試,傳入一個假版本,返回GetAvailableRooms()的硬編碼值。

就我而言,一旦我對後者進行了一段時間的處理,手動實現這些假類變得單調乏味。那麼現在似乎是從手動執行這些假類切換到模擬庫(Moq,FakeItEasy,NSubstitute等)的一個好時機,它會自動執行該過程。在幕後,嘲笑圖書館正在做我們以前手動做的事情。根據我的經驗,這種方法使嘲笑圖書館更容易理解。這就是說,你可能更喜歡「傳入值」的方法,在這種情況下,你可能會不需要嘲笑庫! (或者很少需要它們,手工編寫假類更容易)。

希望這有助於您。