Как написать тест для метода stati c с параметром `out` с помощью Pose C# - PullRequest
1 голос
/ 23 февраля 2020

Я хочу написать тест для метода stati c с пакетом Pose nu-get, но не могу понять, как должен выглядеть синтаксис. Есть один пример для насмешки на странице GitHub, но это только для метода void с одним параметром:

Shim consoleShim = Shim.Replace(() => Console.WriteLine(Is.A<string>())).With(
    delegate (string s) { Console.WriteLine("Hijacked: {0}", s); });

Но мне нужно смоделировать метод: static bool ImagesExistsInDirectory(string ruleId, out string advertise_path); Он отличается от примера, у него есть параметр out и возвращает значение bool. Я думаю, что это должно выглядеть примерно так, но в нем есть ошибка параметров и несовпадающие параметры.

Shim shim = Shim.Replace<string>(
                () => FileOps.ImagesExistsInDirectory(Pose.Is.A<string>(), out Pose.Is.A<string>())
                ).With<string, string>(
                delegate (string a, string b) { StubForStaticImages(a, out b); });

Может кто-нибудь объяснить, как это работает, пожалуйста?

1 Ответ

0 голосов
/ 23 февраля 2020

Первая проблема связана с попыткой использования out с Is.A<string>().

Вторая причина заключается в том, что делегат, определенный для обработки вызова, не соответствует ожидаемому, поскольку определение delegate в лямбде не может иметь out.

Я решил это, сначала создав отдельный делегат, который соответствует предмету, который нужно смоделировать

delegate bool StubForStaticImages(string id, out string path);

, и использовал его при определении прокладки. Остальное было просто следствием следующих примеров в документации.

Для целей тестирования я определил поддельный субъект

class FileOps {
    public static bool ImagesExistsInDirectory(string ruleId, out string advertise_path) {
        advertise_path = "test";
        return false;
    }
}

Следующий пример ведет себя, как и ожидалось, при выполнении теста

[TestMethod]
public void Pose_Static_Shim_Demo_With_Out_Parameter() {
    //Arrange
    var path = Is.A<string>();

    var expectedResult = true;
    var expectedPath = "Hello World";
    var expectedId = "id";
    string actualId = null; ;

    StubForStaticImages stub = new StubForStaticImages((string a, out string b) => {
        b = expectedPath;
        actualId = a;
        return expectedResult;
    });

    Shim shim = Shim
        .Replace(() => FileOps.ImagesExistsInDirectory(Is.A<string>(), out path))
        .With(stub);

    //Act
    string actualPath = default(string);
    bool actualResult = default(bool);
    PoseContext.Isolate(() => {
        actualResult = FileOps.ImagesExistsInDirectory(expectedId, out actualPath);
    }, shim);

    //Assert - using FluentAssertions
    actualResult.Should().Be(expectedResult);   //true
    actualPath.Should().Be(expectedPath);       //Hello World
    actualId.Should().Be(expectedId);           //id
}

Обратите внимание на то, что выше только демонстрирует функциональность самого фреймворка. Сделайте необходимые изменения для ваших реальных испытаний.

...