【问题标题】:FakeItEasy Create a Fake of a ClassFakeItEasy 创建一个假的类
【发布时间】:2011-12-09 18:08:13
【问题描述】:

我最近尝试使用 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,没有奏效?

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

【问题讨论】:

    标签: .net mocking fakeiteasy


    【解决方案1】:

    我知道这是一个老问题,所以我将这个答案发布给遇到这个问题并偶然发现这个问题的任何人。我能够复制与此类似的问题。

    我有一堂课:

    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 确实通过了构造函数(这是我希望通过创建一个 fake 来避免的,因为全局内存不是我的单元测试重点的一部分,我我必须研究是否有不同的方式我应该创建它)。

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

    【讨论】:

      【解决方案2】:

      我无法重现该问题,运行等效代码时它对我有用。您能否创建一个复现问题的 vs 解决方案和submit an issue on GitHub

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-29
        • 1970-01-01
        • 1970-01-01
        • 2012-09-07
        • 1970-01-01
        • 1970-01-01
        • 2014-12-04
        • 2014-05-17
        相关资源
        最近更新 更多