Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何用poseC编写带有'out'参数的静态方法的测试#_C#_.net_Unit Testing_Pose - Fatal编程技术网

C# 如何用poseC编写带有'out'参数的静态方法的测试#

C# 如何用poseC编写带有'out'参数的静态方法的测试#,c#,.net,unit-testing,pose,C#,.net,Unit Testing,Pose,我想用Posenuget包为静态方法编写一个测试,但我不明白语法应该是什么样子。GitHub页面上有一个模拟示例,但它仅适用于具有一个参数的void方法: Shim consoleShim = Shim.Replace(() => Console.WriteLine(Is.A<string>())).With( delegate (string s) { Console.WriteLine("Hijacked: {0}", s); }); 有人能解释一下它是如何工作的

我想用
Pose
nuget包为静态方法编写一个测试,但我不明白语法应该是什么样子。GitHub页面上有一个模拟示例,但它仅适用于具有一个参数的void方法:

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

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

第一个问题是尝试将
out
is.A()
一起使用

第二个原因是定义用于处理调用的委托与预期不匹配,因为在lambda中定义
委托
不能有
输出

我通过首先创建一个单独的委托来解决这个问题,该委托与要模拟的主题相匹配

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
}
[TestMethod]
公共无效姿势\u静态\u垫片\u演示\u带\u Out\u参数(){
//安排
var path=Is.A();
var expectedResult=真;
var expectedPath=“Hello World”;
var expectedId=“id”;
字符串d=null;
StubForStaticImages stub=新StubForStaticImages((字符串a,输出字符串b)=>{
b=预期路径;
d=a;
返回预期结果;
});
垫片=垫片
.Replace(()=>FileOps.ImagesExistsInDirectory(Is.A(),out path))
.带(存根);
//表演
字符串actualPath=默认值(字符串);
bool actualResult=默认值(bool);
PoseContext.Isolate(()=>{
actualResult=FileOps.ImagesExistsInDirectory(expectedId,out actualPath);
},垫片);
//断言-使用FluentAssertions
actualResult.Should().Be(expectedResult);//true
actualPath.Should().Be(expectedPath);//你好,世界
实现.Should().Be(expectedId);//id
}

注意,上面只演示了模拟框架本身的功能。对实际测试进行必要的更改。

请澄清:您是想用
out
参数测试静态方法,还是想用
out
参数模拟静态方法?两者完全不同我想模拟一下,我不关心out参数的值。我只需要从中获取
true
,以便在其他测试中使用。@Nkosi正如我在问题中提到的,有两个问题:1)out param:使用它甚至无法编译。看来,我完全错误地理解了
Pose
中out参数的语法。2) 如果我将
ImagesExistsInDirectory
更改为not use out,则它具有“无法将lambda表达式转换为预期的委托类型,因为块中的某些返回类型不能隐式转换为委托retun类型”和“无法将type
bool
转换为
string
”@Nkosi,对不起,尼克·查克提供了答案。
[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
}