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类型”和“无法将typebool
转换为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
}