簡體   English   中英

如何通過Nunit模擬新對象的構造

[英]How to Mock construction of new objects through Nunit

我想編寫一個nunit測試來測試一個方法,但是我無法模擬在該方法中實例化的對象。

這是代碼:

public class Converter()
{ 
    public void modifyScore(string convertTo){
      ScoreConverter scoreConverter;
      if(convertTo.Equals("decimal"){    
           scoreConverter = new DecimalScoreConverter();
           scoreConverter.determineScore();
      }
      else{
           scoreConverter = new IntegerScoreConverter();
           scoreConverter.determineScore();
      }
}

我想為ModifyScore編寫測試,並想測試調用了哪個對象的方法。

如何使用nunit測試此方法?

首先,您應該開始反對抽象。 我認為所有模擬框架都需要這樣做。 根據您提供給我的信息以及一些假設:

無論如何,我們開始:

public Interface IConverter
{ 
    IScoreConverter ScoreConverter { get; set; };//use constructorinjection instead
    void ModifyScore(string convertTo);
}

public Interface IScoreConverter
{ 
    DetermineScore();
}

我建議您看看起訂量

您需要弄清楚內部對象要返回的內容。 目前,您沒有從ModifyScore返回任何值,因此無需進行任何測試。

如果返回例如字符串,則測試可能如下所示:

var scoreConverterResponse = "theStringYouWantToBeReturned" 

var scoreConverterMock = new Mock<IScoreConverter>();
scoreConverterMock.Setup(sc => sc.DetermineScore())
  .Returns(scoreConverterResponse);

scoreConverterMock.Verify(sc => sc.DetermineScore(It.IsAny<string>()), Times.AtLeastOnce());

我修復了命名約定toom即CamelCase方法。 我是即時編寫的,因此如果出現編譯錯誤,我深表歉意。

單元測試主要基於狀態更改。 因此,自然的過程是:

  • 在課堂上做點事
  • 測試類的狀態是否按預期更改

也許您可以考慮更改代碼以測試scoreConverter的類型:

public class Converter
{ 
    public ScoreConverter scoreConverter { get; set; }

    public void modifyScore(string convertTo){

      if(convertTo.Equals("decimal"){    
           scoreConverter = new DecimalScoreConverter();
      }
      else{
           scoreConverter = new IntegerScoreConverter();
      }
      scoreConverter.determineScore();
}

然后,您的測試可以執行ModifyScore()方法,然后斷言scoreConverter變量的類型。

如果您不想公開該屬性,則另一個選擇是將其設置為內部,然后添加InternalsVisibleToAttribute ,或者使用Factory類,然后在測試中對其進行模擬,如amcdermott所指出的。

問候!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM