2

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

我的服务层:

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 参数,然后在调用后访问它?

4

3 回答 3

5

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

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

于 2012-08-07T19:16:18.373 回答
3

如果您确实需要测试此方法,则可以将其标记为内部并将该类的InternalsVisibleTo属性指定到您的测试命名空间。但是,是的,只需测试公共接口。

于 2012-08-07T19:15:52.843 回答
3

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

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

在此处输入图像描述

于 2012-08-07T19:20:46.143 回答