如何在NUnit 2.5中使用TestCase
本文关键字:TestCase NUnit | 更新日期: 2023-09-27 18:20:15
我有一个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]
写了一个单元测试,如下所示:
[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<Currency>(id);
return c;
}
我知道这是错误的,但我不知道该怎么写。结果会是object
吗?
Result
)必须是常量表达式。不能像现在这样创建对象。
使用TestCase
属性有利于测试需要验证多个简单输入/输出的情况。然而,在您的场景中,您可以这样做(也就是说,如果您只计划验证id代码映射是否正确):
[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<Currency>(id);
return c.Code;
}
另外,请看一下TestCase
文档,它们提供了非常好的示例。
编辑:通过映射测试,我的意思是验证您的ORM映射(NHibernate到数据库)是否正确,是否按预期工作。您通常在以下场景中进行测试:
- 创建具有预定义值的新实体实例(例如
Currency
) - 启动新事务
- 保存实体(
Save
+Flush
+Evict
组合,以确保NHibernate不再将保存的实体存储在缓存中) - 检索实体
- 将检索到的值与预定义的值进行比较
- 回滚事务
如果这样的测试通过,它或多或少地告诉您我可以用这些值保存这个实体,然后我可以用完全相同的值检索它。这就是你想要知道的——映射是正确的。
使用TestCase
属性tho,验证整个对象的正确性是相当困难的——这意味着测试简单的东西。您可以使用其他答案中建议的解决方法(通过TestCase
传递参数),但它很快就会变得不可读且难以维护(想象有6+个属性要验证的实体)。
我建议将您的测试分为一个测试,验证id
到code
的映射是否正确(但我认为这样做没有什么意义,除非您总是计划将某些id映射到某些代码),另一个测试验证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<Currency>(id);
Assert.That(c, Is.EqualTo(new Currency(code, name, symbol)));
}