1

我们使用 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'也是如此)。

有没有办法解决?无论如何,这两个匹配器似乎都具有相似的功能。用完整的命名空间为每个匹配器类添加前缀当然是可行的,但它会使测试的可读性显着降低。

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

4

3 回答 3

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));
于 2011-03-21T11:04:32.937 回答
3

有趣的是,NUnit 还公开了一个名为 Iz 的小类,您可以使用它来避免与 NMock2 的命名冲突。因此,例如,而不是:

Assert.That(someValue, Is.EqualTo(54321))

你可以写

Assert.That(someValue, Iz.EqualTo(54321))

可能不是最干净的,但它确实有效;)

于 2012-01-05T22:17:44.117 回答
1

如果需要使用约束,请使用命名空间别名。例如。

    使用 N = NUnit.Framework;
    使用 M = NMock2;

然后

Assert.That(someValue, Is.EqualTo(54321))
会成为
Assert.That(someValue, N.Is.EqualTo(54321))

于 2011-03-21T11:03:32.617 回答