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

标签 c# .net nosql

我正在研究 NoSQL 数据库并且有一个关于单元测试的问题。对业务逻辑进行单元测试的合适方法是什么?如何模拟 NoSQL 数据库?

最佳答案

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

假设我们有一个 DAL:

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

如您所见,它实现了一个接口(interface),用于为您的业务层提供数据。它可能看起来像这样:

public Interface IDataProvider
{
     String getData();
}

您的业务层可能看起来像这样:

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.
    }

}

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

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

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

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

关于c# - NoSQL - 如何模拟数据库进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10048260/

相关文章:

c# - 如何在输入时保持对 TextBox 的关注?

c# - c#命名空间与文件的关系

.net - 在 .net、winforms 中显示用户控件后,我可以捕获的最后一个可能的事件是什么?

wcf - WCF 的 RESTful 框架替代品

c# - 如何获取 Access (Jet) 数据库中的表列表?

performance - NoSQL 数据库的开销和(低)效率?

php - 从数据库中检索数据的最有效算法

c# - 发布构建复制配置文件到另一个项目

c# - IKVM 帮助 - 创建 dll 时找不到类

hadoop - 向hawq插入流数据