我最近试图使用FakeItEasy,但是我无法在没有解决许多怪癖的情况下从具体类创建假。
我尝试了以下内容:
public class MyObject {
public MyObject(){}
}
...
MyObject fakeObject = A.Fake<MyObject>();
导致找不到具有匹配争议异常的构造函数
接下来我尝试了:
public class MyObject {
public MyObject(string temp){}
}
...
MyObject fakeObject = A.Fake<MyObject>(x => x.WithArgumentsForConstructor(() => new MyObject("temp")));
导致了类似的错误。
最后我尝试了:
public class MyObject {
//public MyObject(){}
}
...
MyObject fakeObject = A.Fake<MyObject>();
这让我最终创造了假货。我很困惑为什么大多数伪造一个具体类的例子都提到了这个我发现它更容易?为什么使用上面的试验#2记录的方法不起作用?
伪造未记录的具体类是否有一些限制?
答案 0 :(得分:3)
我认识到这是一个老问题,所以我发布了这个答案给其他有这个问题的人并且遇到了这个问题。我能够复制一个类似的问题。
我有一个班级:
public class Service : IService
{
public Service (int prNum)
{
//call to a c++ wrapper class (this is where the problem occurs)
//some other calls
}
}
我试图将服务类创建为单元测试的假货:
private Service fakeServ = A.Fake<Service>((x => x.WithArgumentsForConstructor(() => new Service(3))));
我收到了同样的错误:找不到匹配参数异常的构造函数
最后,我使用调试器进入了A.Fake调用,发现构造函数内部的代码(A.Fake确实调用了)由于Visual Studio未在管理员模式下运行而无法初始化全局内存块。 (CreateFileMapping,错误代码5,System Error 0x5: CreateFileMapping())
我将visual Studio设置为以管理员身份运行,问题已解决,虚假创建。
使用带参数的构造函数创建的Fake似乎确实贯穿了构造函数(这是我希望通过创建虚假来避免的,因为全局内存不是我的单元测试的焦点,我&# 39;我必须研究是否有不同的方式来创建它。)
您发布的代码并不表示您正在调用包装类或创建全局内存,但您可以尝试使用调试器进入Fake创建调用以查看构造函数是否开始运行以及构造函数是否出现故障,以及返回的错误。
答案 1 :(得分:0)
我无法重现这个问题,在运行等效代码时,它对我有用。你能创建一个能够重现问题的vs解决方案吗submit an issue on GitHub?