我们使用NUnit(2.5.9)和NMock2进行单元测试和模拟。但是,两者都具有紧密对应的匹配器语法。当我做的时候
using NUnit.Framework;
using NMock2;
以后的NMock2代码:
Expect.Once.On(database).Method("Create").
With(Has.Property("id", Is.EqualTo("012345678901")));
但也是一个NUnit断言:
Assert.That(someValue, Is.EqualTo(54321));
然后VS(2008)会抱怨'Is'是'NUnit.Framework.Is'和'NMock2.Is'之间的模糊参考(和'Has'相同)。
这有什么办法吗?似乎两个匹配器都具有类似的功能。使用完整命名空间前缀每个匹配器类当然有效,但它使测试的可读性大大降低。
谷歌搜索这个问题根本找不到匹配,所以我的下腹感觉是我做的事非常愚蠢。
答案 0 :(得分:3)
您可以避免使用Nunit流利语法。
Assert.AreEqual(54321, someValue);
然后结合使用别名。
using NMock2;
using Is = NMock2.Is;
using Has = NMock2.Has;
这会强制您的应用程序获取这些类的NMock版本。如果你想进入NUnit,你必须提供一个包括命名空间的全名。
保留两者的另一个选择是使用以下命名空间声明和别名。
using NUnit.Framework;
using Is = NUnit.Framework.Is;
using NMock2;
using WithValue = NMock2.Is;
using Has = NMock2.Has;
现在您可以使用两个流畅的接口,但代码为
Expect.Once.On(database).Method("Create").
With(Has.Property("id", WithValue.EqualTo("012345678901")));
Assert.That(someValue, Is.EqualTo(54321));
答案 1 :(得分:3)
有趣的是,NUnit还公开了一个名为Iz的小类,你可以使用它来避免与NMock2的这种命名冲突。例如,而不是:
Assert.That(someValue, Is.EqualTo(54321))
你可以写
Assert.That(someValue, Iz.EqualTo(54321))
可能不是最干净的,但它是doez工作;)
答案 2 :(得分:1)
如果需要使用约束,请使用命名空间别名。 例如
using N = NUnit.Framework; using M = NMock2;
然后
Assert.That(someValue, Is.EqualTo(54321))将成为
Assert.That(someValue, N.Is.EqualTo(54321))