【问题标题】:How to write C# test cases for private functions with "out" parameters?如何为带有“out”参数的私有函数编写 C# 测试用例?
【发布时间】:2012-08-04 20:27:51
【问题描述】:

如何为私有函数的输出参数创建单元测试?

我的服务层:

private int LoadProduct(string productId, out IProduct product)
{
    product = this.Load(productId);

    return ErrorCodes.Success;
}

测试用例:

[Test]
public void LoadProductTest()
{
    var offerService = new OfferProcessor();
    var privateOfferService = new PrivateObject(offerService);

    IProduct myProduct = null;

    var result = (int)privateOfferService.Invoke("LoadProduct", 
                       new object[] {"AnId", myProduct });

    Assert.That(result, Is.EqualTo(ErrorCodes.Success));
    Assert.That(myProduct, Is.NotNull());
}

上述测试用例无法编译。如何传递 Invoke 一个 out 参数,然后在调用后访问它?

【问题讨论】:

  • 一般来说,我总是尝试通过公共接口测试私有方法。严格来说,不应该直接对私有成员进行单元测试。
  • 这能回答你的问题吗? weblogs.asp.net/peterblum/archive/2009/12/10/…
  • @rboarman....测试方法旨在测试面向外部的功能。可以从类外部调用的功能。私有方法已通过该类的令人满意的测试。要测试 LoadProduct(),您需要调用访问它的公共方法。
  • 我认为返回实际对象被认为是一种很好的做法,并且对返回值使用错误代码。如果有错误,抛出异常。如果您返回实际的业务对象,则不会出现此问题。

标签: c# visual-studio-2010 unit-testing nunit


【解决方案1】:

尝试保存传递调用调用的对象数组。

object[] args = new object[] { "AnId", myProduct };
var result = (int)privateOfferService.Invoke("LoadProduct", args);
Assert.That(args[1], Is.NotNull());

https://stackoverflow.com/a/2438069/1311351

【讨论】:

    【解决方案2】:

    如果你真的需要测试这个方法,你可以将它标记为内部,并为你的测试命名空间指定类的InternalsVisibleTo 属性。但是,是的,只需测试公共接口。

    【讨论】:

    • 你不应该改变你的实现来允许测试。
    • 为什么不呢?你为了可读性而改变它,为什么不为了可测试性?
    • 因为现在其他代码可以访问它。首先将其设为私有是有原因的。为了可读性而改变它与为了可测试性而改变它不同。
    • 也许应该将私有方法重构为不同的专用对象的公共方法? blogs.msdn.com/b/jaybaz_ms/archive/2004/06/11/153978.aspx
    【解决方案3】:

    我认为返回实际对象而不使用错误代码作为返回值是一种很好的做法。如果有错误,抛出异常。如果您返回实际的业务对象,则不会出现此问题。

    由于您没有说明您的代码无法编译怎么办,我假设您的测试方法无法访问私有方法。如果您这样做,VS 将允许您测试私有方法(右键单击方法并选择 Create Unit Tests...):

    【讨论】:

      猜你喜欢
      • 2016-06-21
      • 2021-08-06
      • 2016-08-22
      • 2016-09-25
      • 2021-09-13
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多