【问题标题】:How to use TestCase in NUnit 2.5?如何在 NUnit 2.5 中使用 TestCase?
【发布时间】:2012-01-15 12:49:51
【问题描述】:

我有一个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吗?

【问题讨论】:

    标签: c# unit-testing nunit testcase


    【解决方案1】:

    属性参数(对于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 documentation - 他们提供了很好的例子。

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

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

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

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

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

    【讨论】:

    • 谢谢,您能解释一下如何测试多个对象吗?什么是映射测试?
    • @Mark:通过映射测试,您可以验证 ORM 映射是否正确(例如,如果您使用 DateTime 属性集保存实体,它会被映射并保存而不会丢失任何信息)。查看我的编辑。
    【解决方案2】:

    在这种情况下,我将预期结果的构造函数参数传递给测试用例,然后自己进行检查。虽然不是那么简洁,但它完成了工作。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      相关资源
      最近更新 更多