gpt4 book ai didi

c# - 单元测试和 Moq'ing 构造函数参数问题

转载 作者:行者123 更新时间:2023-11-30 12:28:54 25 4
gpt4 key购买 nike

问题背景:

我目前正在尝试对 MVC4 WebApi 项目进行单元测试。

这个项目的结构使用了一个外观类注入(inject)到相关 Controller 的构造函数中。这一切都是通过 Unity 实现的,以将紧密耦合保持在绝对最低限度。

虽然认为 Unity 正在实现,但在单元测试中我将产品 Controller 设置如下:

var repositoryFacade = new RepositoryFacade(new RepositorySelector(new RepositoryGenerator()));

var productController = new ProductController(repositoryFacade)

以下代码显示了 Controller 类的“GetProducts”方法:

public ProductController(IRepositoryFacade facade)
{
_facade = facade;

productRepository = _facade.GetProductRepository();
}

public List<Product> GetProducts()
{
return productRepository.GetProducts();
}

当前代码所在位置:

如果我只是想测试此方法被命中了多少次,我尝试使用 Moq 框架按如下方式设置我的 UnitTest:

[TestMethod]
public void Test_The_GetAllProducts_Method_is_Called()
{

var mockRepositoryGenerator = new Mock<IRepositoryGenerator>();

var mockRepositorySelector = new Mock<IRepositorySelector>(mockRepositoryGenerator.Object);

var mockFacade = new Mock<IRepositoryFacade>(mockRepositorySelector.Object);

mockFacade.Setup(x => x.GetProductRepositoryV1().GetProducts());

var productController = new ProductV1Controller(mockFacade.Object);

var returnedProducts = productController.GetProducts();

mockFacade.VerifyAll();
}

问题:

目前在测试中尝试设置模拟对象的构造函数时出现错误,如下所示:

Constructor arguments cannot be passed for interface mocks.

我理解这一点,因为我正在 Moq'ing 接口(interface)并且没有构造函数,但这也是我对单元测试和模拟的学习知识有点空白的地方。

谁能告诉我如何正确地模拟这个测试?

最佳答案

您的 Controller 取决于存储库。最好明确说明这种依赖关系:

public ProductController(IProductRepository productRepository)
{
_productRepository = productRepository;
}

public List<Product> GetProducts()
{
return _productRepository.GetProducts();
}

测试也变得更加容易:

ProductV1Controller _productController;
Mock<IProductRepository> _mockRepository;

[TestInitialize]
public void TestInitialize()
{
_mockRepository = new Mock<IProductRepository>();
_productController = new ProductV1Controller(_mockRepository.Object);
}

[TestMethod]
public void ShouldLoadAllProducts()
{
_mockRepository.Setup(r => r.GetProducts()).Return(SomeProducts);

var returnedProducts = _productController.GetProducts();

Assert.Equals(returnedProducts, SomeProducts);
_mockRepository.VerifyAll();
}

关于c# - 单元测试和 Moq'ing 构造函数参数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20215358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com