我现在需要模拟某些类才能测试我的软件的某些部分。但当然,我只能使用接口(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)。
- 通过创建模拟,使用该类对代码进行单元测试。
- 对于测试驱动开发,您主要为子组件定义接口(interface)。
- 接口(interface)隔离。
如果您不想要其中任何一个,那么您可以使用 NSubstitute,它也将允许您模拟具体类。
现实场景中的解耦意味着
- 可以通过mock来延迟组件的具体实现 接口(interface)。
- 您可以切换实现,而无需触及已更改实现之外的代码。
关于c# - 除了使测试更容易之外,封闭系统中的接口(interface)还带来什么优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46113896/