我有一个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
吗?
答案 0 :(得分:17)
属性参数(对于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
documentation - 它们提供了很好的例子。
修改强>: 通过映射测试,我的意思是验证您的ORM映射(NHibernate到数据库)是否正确并按预期工作。您通常在以下场景中测试:
Currency
)Save
+ Flush
+ Evict
组合,以确保NHibernate不再将已保存的实体存储在缓存中)如果这样的测试然后通过,它或多或少地告诉你我可以用这些值保存这个实体,然后我可以用完全相同的值来检索它。这就是你想知道的 - 映射是正确的。
使用TestCase
属性,验证整个对象的正确性非常困难 - 这是为了测试简单的东西。您可以使用其他答案中建议的变通方法(通过TestCase
传递参数),但很快变得难以理解且难以维护(想象具有6个以上属性的实体需要验证)。
我建议将您的测试分成一个验证id
到code
的映射是否正确的测试(但是我认为这样做没什么意义,除非您总是计划将某些ID映射到某些代码)和另一个验证Currency
实体是否正确映射到数据库表。
答案 1 :(得分:5)
在这种情况下,我将预期结果的构造函数参数传递给测试用例,并自己进行检查。虽然它不那么简洁,但它可以完成工作。
[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)));
}