Как я могу проверить, имеет ли аргумент определенные значения свойства? - PullRequest
1 голос
/ 13 февраля 2020

Я пытаюсь заглушить RestClient для возврата указанного c ответа на указанный c запрос, который распознается путем проверки конца используемого URL-адреса. Вот код, который я придумал:

_clientStub = Substitute.For<IRestClient>();
_responseStub = Substitute.For<IRestResponse>();
_clientStub
    .Get(
        Arg.Is<IRestRequest>(
            request => request.Resource.EndsWith("config.json")
        )
    )
    .Returns(_responseStub);

Я получаю NullReferenceException для части Arg.Is<IRestRequest>, и если я пытаюсь сохранить ее в переменной для повторного использования, как эта переменная оценивается как null:

protected static readonly IRestRequest CONFIG_QUERY =
    Arg.Is<IRestRequest>(
        request => request.Resource.EndsWith("config.json")
    );

Я следовал второму примеру в документации , поэтому я не совсем уверен, что происходит не так. Любая помощь?


Уточнение

Для воспроизводимости я создал минимальный пример:

[Fact]
public void StackOverflowTest()
{
    RestSharp.IRestClient clientStub = Substitute.For<RestSharp.IRestClient>();
    RestSharp.IRestResponse responseStub = Substitute.For<RestSharp.IRestResponse>();
    clientStub
        .Get(
            Arg.Any<RestSharp.IRestRequest>()
        )
        .Returns(responseStub);
}

Да, в этом тесте нет утверждений. Я даже не получаю их в любом случае, так как последняя команда уже бросает и NullReferenceException. Интерфейсы от RestSharp , но это не должно иметь большого значения.


Обновление

Чтобы сузить проблему, я создал еще более простой пример, и теперь он работает :

public interface IStackOverflowResponse { };
public interface IStackOverflowRequest { };
public interface IStackOverflowClient
{
    IStackOverflowResponse Get(IStackOverflowRequest request);
}

[Fact]
public void StackOverflowTest()
{
    IStackOverflowClient clientStub = Substitute.For<IStackOverflowClient>();
    IStackOverflowResponse responseStub = Substitute.For<IStackOverflowResponse>();
    clientStub
        .Get(
            Arg.Any<IStackOverflowRequest>()
        )
        .Returns(responseStub);
}

Так что теперь я предполагаю, что есть специфическая c проблема с насмешкой RestSharp.RestClient. Я предполагаю, что проблема заключается в методах расширения насмешек / заглушек, поскольку IRestClient не имеет метода Get сам по себе, но вместо этого есть метод расширения для него.

1 Ответ

1 голос
/ 13 февраля 2020

Проблема заключается в функции Get, равной IRestClient ..., поскольку ее нет. Это просто метод расширения в RestClientExtensions. Как вы можете видеть в исходном коде , он просто вызывает Execute с Method.GET в качестве параметра. Поэтому правильный способ заглушки

clientStub
    .Get(
        Arg.Any<RestSharp.IRestRequest>()
    )
    .Returns(responseStub);

заключается в следующем:

clientStub
    .Execute(
        Arg.Any<RestSharp.IRestRequest>(),
        Method.GET
    )
    .Returns(responseStub);

...