NSubstitute: проблема с насмешкой метода получения синтетического сахара, связанного с переменной-членом без соответствующего установщика - PullRequest
0 голосов
/ 08 марта 2019

Для моего приложения .NET C # я использую стороннее программное обеспечение для электронной почты с именем efaxdeveloper.com

Мне нужно было издеваться над объектом OutfResponse программного обеспечения efaxdeveloper.com.

Пожалуйста, имейте в виду, что, поскольку это сторонняя программа, я, очевидно, не могу изменять сторонние библиотеки.

В файле 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 Ответ

2 голосов
/ 08 марта 2019

NSubstitute не может издеваться над этим типом, потому что у него нет virtual членов.(Мы также не можем вручную создать подтип OutboundResponse, который переопределяет геттеры и выставляет сеттеры, и используем его для тестирования по той же причине.)

Возможно, вам будет проще, если вы создадитеинтерфейс, который инкапсулирует все необходимое поведение из сторонней библиотеки ( шаблон фасада ) и тестирует взаимодействие вашего кода с этим интерфейсом.Затем вы можете отдельно протестировать реализацию этого интерфейса, которая дает правильные результаты при вызове сторонней библиотеки.Это могут быть интеграционные или ручные тесты.

<shamelessplug> Ранее я немного писал о минусах типов насмешек, которыми мы не владеем , которые могут оказаться полезными для вас. </shamelessplug>

...