如何在NUnit 2.5中使用TestCase?

8

我有一个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;
    }

我知道这样写是错误的,但我不确定该如何编写。结果可以是一个对象吗?

2个回答

17

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

使用TestCase属性适用于测试需要验证多个简单输入/输出的情况。在您的场景中,您可以执行以下操作(即,如果您仅计划验证id-code映射是否正确):

[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属性验证整个对象的正确性相当困难-它旨在测试简单的内容。 您可以使用其他答案中建议的解决方法(通过TestCase传递参数),但它很快变得难以阅读和维护(想象一下具有6个以上属性要验证的实体)。

我建议将测试分成两部分,一部分验证idcode的映射是否正确(但我认为这样做没有多大意义,除非您总是计划将某些id映射到某些代码),另一部分验证Currency实体是否正确地映射到数据库表中。


谢谢,您能解释一下我如何测试多个对象吗?什么是映射测试? - Mark Allison
@Mark:通过映射测试,您可以验证ORM映射是否正确(例如,如果您保存具有“DateTime”属性设置的实体,则它将被映射并保存而不会丢失任何信息)。请查看我的编辑。 - k.m

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)));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接