微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#stubbing.每个可测试对象的接口?

我已经看到了关于’如何存根你的课程以便你可以控制SUT内发生的事情’的多个答案.

他们说一件事:

Create an interface and inject that interface using dependency injection and create a stub using that same interface that you then inject into the SUT.

但是,我在以前的工作场所学到了什么:

If you unit test,you test all classes/functionality.

这是否意味着对于每个具有特定功能布局的类,您必须创建一个接口?

这意味着类/文件数量几乎是两倍.

如下面的例子所示,这是“走的路”还是我在单元测试过程中遗漏了什么?

作为一个说明:
我正在使用VS2012 Express.这意味着没有’Faker’框架.我正在使用’标准’VS2012单元测试框架.

作为一个非常非常简单的例子,它允许我将传递给SUT的每个接口存根.

IFoo.cs

public interface IFoo
{
    string GetName();
}

Foo.cs

public class Foo : IFoo
{
    public string GetName()
    {
        return "logic goes here";
    }
}

IBar.cs:

public interface IBar : IFoo
{
    IFoo GetFoo();
}

Bar.cs:

public class Bar : IBar
{
    public string GetName()
    {
        return "logic goes here";
    }

    public IFoo GetFoo()
    {
        return null; // some instance of IFoo
    }
}

IBaz.cs:

public interface IBaz
{
    IBar GetBar();
}

Baz.cs:

public class Baz
{
    public IBar GetBar()
    {
        return null; // some instance of IBar
    }
}

解决方法

是的,不是.为了存根依赖,你需要某种抽象,但这主要是因为模拟框架 work(不是全部,自然).

考虑简单的例子.你测试A类,它依赖于B类和C类.对于A的单元测试来说,你需要模拟B和C – 你需要IB和IC(或基类/ w虚拟成员).你需要IA吗?不,至少不适合这个测试.除非A成为对其他类的依赖,否则不需要在接口/基类后面抽象它.

抽象很棒,因为它可以帮助您构建丢失耦合的代码.您应该抽象您的依赖项.但是,在实践中,某些类不需要被抽象,因为它们服务于顶层/层次结构/根角色,并且不在其他地方使用.

原文地址:https://www.jb51.cc/c/117057.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐