[英]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.