如何在c# MVC单元测试中防止数据库效应
本文关键字:数据库 单元测试 MVC | 更新日期: 2023-09-27 18:15:10
当我对插入、更新和删除操作应用单元测试时。同时在数据库中插入、更新和删除记录。
怎么可能?谁能给出防止数据库效应的解决方案?
谢谢,
理想情况下,您应该在存在db交互的场景中使用mock。确保您已经分离出数据库交互逻辑,并且它是接口驱动的。然后可以创建模拟对象,在其中定义数据库交互接口的期望。例如,如果调用InsertSomething()方法,该方法应该返回什么?等等......分享一些关于单元测试和模拟细节的链接。
https://msdn.microsoft.com/en-us/library/ff650441.aspx https://github.com/Moq/moq4 http://www.developerhandbook.com/unit-testing/writing-unit-tests-with-nunit-and-moq/使用NULL引用异常测试MVC控制器失败
作为另一种选择,如果必须对数据库执行测试,则可以使用单独的真实数据库进行测试。您还可以在开始时和运行测试后分别执行sql脚本来播种和清理数据,以保持数据库的原始状态
可以模拟数据库(用于单元测试)或创建仅用于测试目的的新数据库(集成测试)。我建议将这两种方法结合使用。请记住,单元测试的数量应该比集成测试大得多。
下面是如何模拟数据库的简单示例(使用Moq库)。
public class HomeController : Controller
{
private IUserRepository _repository;
public HomeController(IUserRepository repository)
{
_repository = repository;
}
public ActionResult AddNewUser(User newUser)
{
_repository.AddUser(newUser);
return View();
}
}
public interface IUserRepository
{
void AddUser(User newUser);
}
public class UserRepository : IUserRepository
{
private DBContext _context;
public UserRepository(DBContext context)
{
_context = context;
}
public void AddUser(User newUser)
{
_context.Users.Add(newUser);
}
}
[Test]
public void ShouldMockRepository()
{
// Given
var repository = new Mock<IUserRepository>();
var controller = new HomeController(repository.Object);
// When
controller.AddNewUser(new User());
// Then
repository.Verify(r => r.AddUser(It.IsAny<User>()), Times.Once);
}