1

我想用Posenu-get 包为静态方法编写一个测试,但我不明白语法应该是什么样子。在 GitHub 页面上有一个 mocking 的示例,但它仅适用于具有一个参数的 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); });

有人可以解释一下它是如何工作的吗?

4

1 回答 1

1

第一个问题是尝试使用outwith Is.A<string>()

第二个是因为定义来处理调用的委托与预期的不匹配,因为delegate在 lambda 中定义 a 不能有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
}

请注意,以上仅演示了模拟框架本身的功能。为您的实际测试进行必要的更改。

于 2020-02-23T13:38:41.577 回答