混合NUnit和NMock2匹配器时的模糊引用

时间:2011-03-21 10:56:56

标签: c# .net nunit nmock matcher

我们使用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'相同)。

这有什么办法吗?似乎两个匹配器都具有类似的功能。使用完整命名空间前缀每个匹配器类当然有效,但它使测试的可读性大大降低。

谷歌搜索这个问题根本找不到匹配,所以我的下腹感觉是我做的事非常愚蠢。

3 个答案:

答案 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))