5

我最近尝试使用 FakeItEasy,但如果不解决许多怪癖,我无法从具体类创建 Fake。

我尝试了以下方法:

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,没有工作?

伪造没有记录的具体类是否有一些限制?

4

2 回答 2

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,系统错误 0x5:CreateFileMapping()

我将 Visual Studio 设置为以管理员身份运行,问题得到解决,创建了假的。

似乎使用带参数的构造函数创建的 Fake 确实通过了构造函数(这是我希望通过创建一个 fake 来避免的,因为全局内存不是我的单元测试重点的一部分,我将不得不看看我是否应该以不同的方式创建它)。

您发布的代码并不表示您正在调用包装类或创建全局内存,但您可以尝试使用调试器进入 Fake 创建调用,以查看构造函数是否开始运行以及构造函数是否出现故障,以及什么返回错误。

于 2016-05-27T19:52:22.837 回答
0

我无法重现该问题,运行等效代码时它对我有用。您能否创建一个复现问题的 vs 解决方案并在 GitHub 上提交问题

于 2011-10-18T13:47:19.700 回答