如何通过Nunit模拟新对象的构造

本文关键字:对象 何通过 Nunit 模拟 新对象 | 更新日期: 2023-09-27 17:49:36

我想写一个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测试此方法?

如何通过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());

我修正了命名约定,即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指出的。

问候!