如何在NUnit 2.5中使用TestCase?

我有一个Currency类,我使用NHibernate将其保存到我的数据库中。 Currency类看起来像这样:

 public class Currency : Entity { public virtual string Code { get; set; } public virtual string Name { get; set; } public virtual string Symbol { get; set; } } 

我使用[TestCase]编写了一个unit testing,如下所示:

  [TestCase(6,Result = new Currency ({ Code="GBP", Name="British Pound", Symbol="£"}))] public Currency CanGetCurrencyById(int id) { ICurrencyRepo currencies = new RepoFactory().CreateCurrencyRepo(_session); Currency c = currencies.GetById(id); return c; } 

我知道这是错的,但我不确定如何写它。 结果可以是一个object吗?

属性参数(对于Result )必须是常量表达式。 您不能像现在这样创建对象。

使用TestCase属性适用于需要validation多个简单输入/输出的测试用例。 在你的场景中,你可以做这样的事情(也就是说,如果你只打算validationid代码映射是否正确):

 [TestCase(6, Result = "GBP")] [TestCase(7, Result = "USD")] [TestCase(8, Result = "CAD")] public string CanGetCurrencyById(int id) { ICurrencyRepo currencies = new RepoFactory().CreateCurrencyRepo(_session); Currency c = currencies.GetById(id); return c.Code; } 

另外,看看TestCase文档 – 它们提供了很好的例子。

编辑 :通过映射测试,我的意思是validation您的ORM映射(NHibernate到数据库)是否正确并按预期工作。 您通常在以下场景中测试:

  1. 使用预定义值创建新实体实例(例如Currency
  2. 开始新的交易
  3. 保存实体( Save + Flush + Evict组合以确保NHibernate不再将已保存的实体存储在缓存中)
  4. 检索实体
  5. 将检索到的值与预定义的值进
  6. 回滚事务

如果这样的测试然后通过,它或多或少地告诉你我可以用这些值保存这个实体,然后我可以用完全相同的值检索它 。 这就是你想知道的全部 – 映射是正确的。

使用TestCase属性,validation整个对象的正确性非常困难 – 这是为了测试简单的东西。 您可以使用其他答案中建议的变通方法(通过TestCase传递参数),但很快就会变得难以理解且难以维护(想象具有6个以上属性的实体需要validation)。

我建议将你的测试分成一个,validationidcode映射是否正确(但是我认为这样做没什么意义,除非你总是计划将某些id映射到某些代码),另一个validation是否正确映射了Currency实体到数据库表。

在这种情况下,我将预期结果的构造函数参数传递给测试用例,并自己进行检查。 虽然它不够简洁,但它可以完成工作。

 [TestCase(6, "GBP", "British Pound", "£")] public void CanGetCurrencyById(int id, string code, string name, string symbol) { ICurrencyRepo currencies = new RepoFactory().CreateCurrencyRepo(_session); Currency c = currencies.GetById(id); Assert.That(c, Is.EqualTo(new Currency(code, name, symbol))); }