0

我使用 NUnit 进行单元测试。在我当前的项目中,我遇到了一个问题,我想测试的几乎所有功能都连接到数据库。同时,数据库在应用程序启动时是有界的。

我现在很困惑,我读过关于模拟单元测试的内容,但不知道如何处理这个问题。我这里有什么解决方案吗?

更难的是,这个数据库是静态的,而不是我的方法的参数......这让我很困惑

4

2 回答 2

2

您可能想要查看应用程序的体系结构。确保数据库层是松散耦合的,例如通过使用接口。这将使为您的数据库层编写存根或模拟成为可能。

于 2012-06-22T07:55:06.223 回答
1

The normal solution to this is to keep your data layer in a separate class that implements a well-known interface. For instance:

public interface IDataLayer
{
    IEnumerable<Customer> GetAllCustomers();

    Order GetOrderById(int id);
}

You will implement the interface as normal for your actual data access

public class SqlServerDataLayer : IDataLayer
{
    // implementation
}

But in your tests, you can now use a mocking framework like Moq or RhinoMocks to set up a mock data layer that returns test data. This ensures you are only testing how your classes use the data, which is ideal.

[Test]
public void TestGettingCustomersRefreshesViewModel()
{
    //arrange
    var mockDb = new Mock<IDataLayer>();
    mockDb.Setup(db => db.GetAllCustomers()).Returns(new List<Customer>());
    underTest.DataRepository = mockDb.Object;

    //act
    underTest.GetCustomerCommand.Execute();

    //assert
    Assert.That(underTest.CustomerList != null);
}
于 2012-06-22T08:38:33.917 回答