1

我正在尝试重组我的项目,以便我正在开发一个接口,最终能够创建用于测试的模拟对象,但我在实现/理解某些概念时遇到了麻烦。我有一个IProductsProducts. 但显然我希望能够创建一个模拟 Products 对象。

如何让它依赖于接口而不是实现?

public void AddNewProduct()
        {
            IDatabase db = new Database();
            IProducts products = new Products();
            products.addProductsToCache();
        }

即我将如何指定此代码来使用该MockDatabase对象。

4

2 回答 2

0

假设您有一个要测试的 Inventory 类。Inventory 依赖于 IProducts。所以它不应该关心它使用哪个 Iproducts 实现。唯一重要的是它必须是 IProducts 的一个实例。在生产中,IProducts 的实例将是 Products 的实例。在测试中,它将是模拟 Iproducts 的实例。

如果你引入了一个接口(IProducts),但是 Inventory 仍然依赖于具体的 Products 类,那么你的接口就没用了。它应该只依赖于接口,而不是实现。

于 2013-02-13T14:57:45.570 回答
0

我会将产品传递给方法:

public class YourProductContainerClass
{
    private readonly IDatabase _database;
    private readonly IProducts _products;

    public YourProductContainerClass(
        IDatabase database,
        IProducts products)
    {
        _database = database;
        _products = products;
    }

    public void AddNewProduct(IProduct product)
    {
        products.Add(product);
    }
}

只要我的2美分就可以了。我从不创建一个interface公正的“因为我可能会在稍后的时间点编写一个测试”。我编写了我的单元测试,因此我需要一个接口。

如果我不编写单元测试,那么我也不会创建接口。

为什么不?因为很可能由于各种原因,对单元测试的需求永远不会得到足够的优先级。然后你有更新代码+接口的维护成本,而它并没有真正在你的设计中添加一些东西(除了增加 LoC 的数量)。

所以,恕我直言:习惯于在函数之前编写测试。如果出于某种原因您看不到单元测试的必要性,还要考虑为类编写接口是否有意义。

PS:像这样的工具Resharper可以很容易地在以后的时间点提取界面并将遗留的界面重构到您的界面中。这也是TDD的一个魅力,它可以消除很多痛苦。

于 2013-02-13T15:55:53.363 回答