如何在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吗?

如何在NUnit 2.5中使用TestCase

属性参数(对于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到数据库)是否正确,是否按预期工作。您通常在以下场景中进行测试:

  1. 创建具有预定义值的新实体实例(例如Currency
  2. 启动新事务
  3. 保存实体(Save+Flush+Evict组合,以确保NHibernate不再将保存的实体存储在缓存中)
  4. 检索实体
  5. 将检索到的值与预定义的值进行比较
  6. 回滚事务

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

使用TestCase属性tho,验证整个对象的正确性是相当困难的——这意味着测试简单的东西。您可以使用其他答案中建议的解决方法(通过TestCase传递参数),但它很快就会变得不可读且难以维护(想象有6+个属性要验证的实体)。

我建议将您的测试分为一个测试,验证idcode的映射是否正确(但我认为这样做没有什么意义,除非您总是计划将某些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)));
}