NSubstitute:无法模拟与成员变量相关联的语法糖获取器方法,而没有相应的设置器

时间:2019-03-08 00:01:56

标签: unit-testing mocking nsubstitute stubbing

对于我的.NET C#应用程序,我正在使用名为efaxdeveloper.com的第三方电子传真软件

我需要模拟efaxdeveloper.com的软件OutboundResponse对象。

请记住,由于它是第三方,因此我显然不能修改第三方dll。

在eFaxDeveloper.dll中,以下是OutboundResponse类的代码:

using System.Runtime.InteropServices;

namespace J2.eFaxDeveloper.Outbound
{
    //
    // Summary:
    //     oubound response
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [System.Runtime.Serialization.DataContractAttribute(Namespace = "")]
    public class OutboundResponse
    {
        public OutboundResponse();

        //
        // Summary:
        //     Unique client specified transmission identifier
        public string TransmissionID { get; }
        //
        // Summary:
        //     eFax Developer™ transmission identifier
        public string DOCID { get; }
        //
        // Summary:
        //     J2.eFaxDeveloper.Outbound.StatusCode
        public StatusCode StatusCode { get; }
        //
        // Summary:
        //     Status description
        public string StatusDescription { get; }
        //
        // Summary:
        //     J2.eFaxDeveloper.Outbound.ErrorLevel
        public ErrorLevel ErrorLevel { get; }
        //
        // Summary:
        //     Error message
        public string ErrorMessage { get; }
    }
}

由于只有吸气剂,因此我尝试了以下代码片段:

    OutboundResponse outboundResponseInQuestion = Substitute.For<OutboundResponse>();

    outboundResponseInQuestion.TransmissionID.Returns("someTransmissionID");

不幸的是,outboundResponseInQuestion.TransmissionID抛出

'outboundResponseInQuestion.TransmissionID'引发了类型为'System.NullReferenceException'的异常

我无法为OutboundResponse类创建接口,所以有人可以告诉我如何使用NSubstitute模拟所说的对象并使其返回正确的值吗?

1 个答案:

答案 0 :(得分:2)

NSubstitute无法模拟此类型,因为它没有virtual成员。 (出于相同的原因,我们也无法手动创建OutboundResponse的子类型,该子类型将覆盖getter并公开setter并将其用于测试。)

通过创建一个封装第三方库(facade pattern)所需行为的整体的接口并测试代码与该接口的交互,您可能会更轻松。然后,您可以在调用第三方库时分别测试该接口的实现是否产生正确的结果。这些可以是集成测试或手动测试。

<shamelessplug>我以前写过一些关于downsides of mocking types we don't own的内容,您可能会觉得有用。</shamelessplug>