1

我只是想知道这是否会涉及多层间接?

替代文字 http://img244.imageshack.us/img244/7371/classdiagram1.jpg

我试着做一点解释。这个想法是我在一个只公开 Do 和 Eval 方法的 COM 对象之上构建一个 API。

以前我刚刚将一个 IComObject 传递给 Table 类并直接针对它工作,但这意味着当我尝试测试 Table 类时,我已经模拟了 IComObject 并担心命令会发送到我的表类中的 COM 对象。

基本思想是我有命令运行器,负责在 COM 对象中调用正确的命令,而表(和其他)对象只与命令运行器对话,而不必担心正在执行的命令。然后在我的测试中我可以这样做:

Mock<TableCommandRunner> mockrunner = new Mock<TableCommandRunner>();
mockrunner.Setup(run => run.getName("DummyTable")).Returns("FakeName");

Table table = new Table("DummyTable");
//Table.Name just calls commandrunner.getName
Assert.Equal(table.Name,"FakeName");

是否有太多的间接层,或者这样可以吗?

注意:我将有更多的类,而不仅仅是表,诸如地图、窗口、对象等之类的东西都会与命令运行程序对话。

4

3 回答 3

7

你需要问的问题是,这个额外的抽象是否解决了你在添加它之前遇到的一些问题,你可以接受抽象的复杂性吗?何时抽象是一个相当主观的决定……正如人们常说的,抽象几乎可以解决任何问题,但代价是更大的复杂性。

如果您在问这个问题,您似乎在质疑这种抽象带来的额外复杂性的价值。考虑到您的图表,它看起来并不复杂,如果它确实解决了您之前遇到的问题......我会说去吧。

最终,随你的直觉走……必要时抽象,但如果可以的话,尽量避免。

于 2009-06-09T07:25:52.477 回答
2

我不认为这是太多的抽象层次。您的解决方案对我来说看起来很优雅,因为您只是在测试 Table 类是否调用了正确的 ComandRunner 函数。您正在测试 Table 类如何处理 CommandRunner,并且您已经消除了包括 IComObject 在内的 CommandRunner 实现的所有复杂性。这就是 Mocking 的全部意义所在。

于 2009-06-09T16:26:11.493 回答
0

我不太确定,但对我来说,当有疑问时,我总是喜欢提供包装这种抽象的快捷方便的方法。

就像是

void runCommand(string cmd) // objects instantiated and used inside

所以即使我有太多的抽象,仍然有一种直接的方式来“做它该死的”。

于 2009-06-09T07:24:15.710 回答