如何在c# MVC单元测试中防止数据库效应

本文关键字:数据库 单元测试 MVC | 更新日期: 2023-09-27 18:15:10

当我对插入、更新和删除操作应用单元测试时。同时在数据库中插入、更新和删除记录。

怎么可能?谁能给出防止数据库效应的解决方案?

谢谢,

如何在c# MVC单元测试中防止数据库效应

理想情况下,您应该在存在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);
    }