NoSQL - 如何模拟数据库进行单元测试?

Mar*_*sel 5 .net c# nosql

我正在研究NoSQL数据库,并对单元测试有疑问.对业务逻辑进行单元测试的适当方法是什么?如何模拟NoSQL数据库?

Ole*_*ksi 2

您的业​​务逻辑不应直接接触数据库,而应通过数据库访问层。这使您可以模拟中间层以进行单元测试。为此,您可以使用依赖注入和模拟。有一些框架可以帮助您完成这两件事,但您也可以手动完成。这是一个例子:

假设我们有一个 DAL:

public class DBDataProvider: IDataProvider
{
    public string getData()
    {
         //SQL to get data from actual database.
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这实现了一个为业务层提供数据的接口。它可能看起来像这样:

public Interface IDataProvider
{
     String getData();
}
Run Code Online (Sandbox Code Playgroud)

您的业​​务层可能如下所示:

public BusinessClass
{
    private IDataProvider dataProvider;

    public BusinessClass()
    {
        dataProvider = new DBDataProvider();
    }

    public BusinessClass(IDataProvider provider)
    {
        dataProvider = provider;
    }

    public void doBusinessStuff()
    {
        dataProvider.getData(); 
        //Do something with data.
    }

}
Run Code Online (Sandbox Code Playgroud)

因此,现在在您的生产代码中,您将使用默认构造函数创建业务类,这将自动使您的类与数据库连接。但是,请注意,我们可以使用指定的 IDataProvider 创建 BusinessClass。因此,您可以制作一个“假”数据提供程序仅用于测试:

public class MockDataProvider: IDataProvider
{
    public string getData()
    {
         //return some expected result that you can control, without doing a DB call.
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,在您的测试中,您可以创建一个新的 MockDataProvider,并将其传递到 BusinessClass 的构造函数中。您的业​​务类现在将使用您的模拟数据提供程序,而不是真正的数据库。

在这里,我手工完成了所有操作,但它可以让您了解这是如何工作的。在现实生活中,您可以使用模拟和依赖注入框架为您编写一堆代码。