gpt4 book ai didi

entity-framework - 对使用 Entity Framework Core 1.1.2 调用的存储过程进行单元测试

转载 作者:行者123 更新时间:2023-11-28 20:51:09 25 4
gpt4 key购买 nike

我有一个使用 Entity Framework 调用存储过程的方法,存储过程返回一些数据。

类似下面的内容

public async Task<IActionResult> Get(int customerId)
{
List<Product> products = _context.Products.FromSql("EXECUTE dbo.SpGatherProductInfo {0}", customerId)
.ToList();

if (!products.Any())
{
return NotFound();
}

return Ok(products);
}

如果这是对表的简单查询,我会创建一个内存数据库,添加一些假条目,一切都会好起来的。

但是这使用了存储过程,我该如何对其进行单元测试?

最佳答案

您过于关注实现问题。在这种情况下, Entity Framework 是一个实现问题。

这看起来是将关注点封装到抽象中的好案例。

public interface IProductService  {
Task<List<Product>> GatherProductInfo(int customerId);
}

并将其注入(inject) Controller

public class ProductsController : Controller {
private readonly IProductService service;

public ProductsController(IProductService service) {
this.service = service;
}

public async Task<IActionResult> Get(int customerId) {
List<Product> products = await service.GatherProductInfo(customerId);

if (!products.Any()) {
return NotFound();
}

return Ok(products);
}
}

IProductService 实现将取决于上下文和实际存储过程的执行,而 Controller 仅取决于抽象。 Controller 不应该关心数据的来源。

这现在允许 Controller 在隔离中进行单元测试,而无需像 Entity Framework 那样与实现问题紧密耦合。

public async Task Product_Not_Found() {

//Arrange
var customerId = 1;
var products = new List<Product>();// Currently empty but could easily
// be populated for another test.
var mock = new Mock<IProductService>();
mock.Setup(_ => _.GatherProductInfo(customerId)).Returns(products);

var controller = new ProductsController(mock.Object);

//Act
var result = await controller.Get(customerId);

//Assert
result.Should().NotBeNull()
.And.BeTypeOf<NotFoundResult>();
}

关于entity-framework - 对使用 Entity Framework Core 1.1.2 调用的存储过程进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46104480/

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