如何在NUnit 2.5中使用TestCase?

Mar*_*son 8 c# nunit unit-testing testcase

我有一个Currency类,我使用NHibernate持久保存到我的数据库.Currencyclass看起来像这样:

public class Currency : Entity
{
    public virtual string Code { get; set; }
    public virtual string Name { get; set; }
    public virtual string Symbol { get; set; }        
}
Run Code Online (Sandbox Code Playgroud)

我用这样写了一个单元测试[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;
    }
Run Code Online (Sandbox Code Playgroud)

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

k.m*_*k.m 17

属性参数(for 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

我建议拆分测试到一个验证的映射是否idcode正确的是(但我看不出有什么点,这样做,除非你一直计划要映射到特定的代码一定IDS)和另一种验证是否Currency实体正确映射到数据库表.


das*_*ght 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)));
}
Run Code Online (Sandbox Code Playgroud)