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

我知道这是错误的,但我不知道该怎么写。结果可以是object

4

2 回答 2

17

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

我建议将您的测试分成一个验证idto的映射是否code正确(但是我认为这样做没有什么意义,除非您总是计划将某些 id 映射到某些代码)和另一个验证Currency实体是否正确映射到数据库表.

于 2012-01-15T12:55:00.733 回答
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)));
}
于 2012-01-15T13:03:26.077 回答