使用模拟进行单元测试。父级没有默认构造函数

dat*_*r02 6 c# nunit unit-testing moq

我正在尝试编写单元测试并遇到错误,

Parent 没有默认构造函数。必须显式定义默认构造函数。

我查看了这意味着什么,我看到它提到没有公共构造函数。唯一的问题是,我的代码确实有这个,所以我很困惑为什么会出现这个错误。

这是单元测试..

public void CalculateVat_ReturnsCorrectAmount()
{
    // Arrange
    const decimal expectedResult = 2;

    _mockSingleValueParameter = new Mock<ISingleValueParameterService>();
    _mockItemCache = new Mock<ItemCache>();
    _mockReferenceDataService = new Mock<ReferenceDataService>();

    _Calculator = new CostCalculator(_mockSingleValueParameter.Object, _mockItemCache.Object,
        _mockReferenceDataService.Object);
    // end

    //.....    
}
Run Code Online (Sandbox Code Playgroud)

线路

_calculator = new CostCalculator(_mockSingleValueParameter.Object, _mockItemCache.Object,
            _mockReferenceDataService.Object)
Run Code Online (Sandbox Code Playgroud)

是抛出错误的那个。

CostCalculator这是..的构造函数

public CostCalculator(
    ISingleValueParameterService singleValueParameterService, ItemCache cache, ReferenceDataService referenceDataService);
{
    _itemCache = cache;
    _singleValueParamService = singleValueParameterService;
    _refDataService = referenceDataService;
}
Run Code Online (Sandbox Code Playgroud)

项目中还有其他代码看起来也像这样但可以工作..我无法理解它们之间有什么区别。

蒂亚!

Owe*_*ing 2

如果你想模拟一个具体的类而不是一个接口,它必须有一个默认的构造函数(即没有参数),并且你想要执行设置的任何方法都必须是虚拟的。

在您的情况下,看起来其中一个ItemCacheReferenceDataService(或两者)都缺少默认构造函数。

  • @dataCruncher02 正确。它们是否需要模拟,或者您可以只使用真正的实现吗?如果它们需要模拟,并且您无法更改设计以使用接口并模拟这些接口,那么您需要添加默认参数或将参数传递给模拟构造函数。 (2认同)