c# - 除了使测试更容易之外,封闭系统中的接口(interface)还带来什么优势?

标签 c# unit-testing interface mocking

我现在需要模拟某些类才能测试我的软件的某些部分。但当然,我只能使用接口(interface)来模拟它们。例如,如果我有这样的东西(使用起订量):

    [TestMethod]
    public void AddTestTaskTest()
    {
        TestTask assignable = null;
        var contextMock = new Mock<ApplicationDatabaseContext>();
        var appDbAdaptorMock = new Mock<ApplicationDatabaseAdaptor>(contextMock.Object);

        var dbOpMock = new Mock<TestTaskDbOperator>();

        void Action(TestTask t) => assignable = t;
        dbOpMock.Setup(p => p.Add(It.IsAny<TestTask>())).Callback<TestTask>(Action);
        appDbAdaptorMock.Setup(d => d.TestTasks).Returns(dbOpMock.Object);

        var db = new ApplicationDatabaseController(appDbAdaptorMock.Object);
        var task = CreateTestTaskObject(1);
        db.AddTestTask(task);
        Assert.AreEqual(task, assignable);
    }

(测试还没有多大意义,但它是关于原理的)

然后我显然必须创建一个接口(interface)IApplicationDatabaseAdaptor,以便我可以使用模拟覆盖属性和方法。我在其他地方看到了很多在 SO 和其他地方这样做的建议,理由是它可以实现解耦。

“实现解耦”是什么意思?为什么这么多人鼓励使用这样的接口(interface),为什么创建这样的接口(interface)不被认为是不好的做法?特别是如果我知道我只会用它们来 mock ,而没有其他用途。

最佳答案

出于某些原因,任何未封装的东西都应该定义接口(interface)。

  1. 通过创建模拟,使用该类对代码进行单元测试。
  2. 对于测试驱动开发,您主要为子组件定义接口(interface)。
  3. 接口(interface)隔离。

如果您不想要其中任何一个,那么您可以使用 NSubstitute,它也将允许您模拟具体类。

现实场景中的解耦意味着

  1. 可以通过mock来延迟组件的具体实现 接口(interface)。
  2. 您可以切换实现,而无需触及已更改实现之外的代码。

关于c# - 除了使测试更容易之外,封闭系统中的接口(interface)还带来什么优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46113896/

相关文章:

java - 此测试值会在系统中造成感染吗?

java - 在 Java 泛型中创建类型对象

javascript - 部署时为 "That assembly does not allow partially trusted callers"

python - 使用 Green 单元测试运行程序使测试超时

c# - 在 Blazor 客户端中存储 JWT token

javascript - Angular2 - 使用 debounceTime 测试调用

android 哪个类提供对 SharedPreferences 接口(interface)的定义

java - RMI:如果只有一个 JVM,则远程方法的参数是否必须实现可序列化?

c# - 异步编程实际上与同步编程总共花费相同的时间

c# - 从firefox扩展名连接到C#应用程序中的localhost服务器