为什么Fakes执行真正的方法?

时间:2014-02-27 00:29:34

标签: .net unit-testing c#-4.0 microsoft-fakes

我使用MS Fakes创建了一个课程。这个类被注入到另一个没有存根的类中:

var stubClassA = new MyNamespace.Fakes.StubClassA();
ClassB classB = new ClassB(stubClassA);
classB.DoSomething(10);

当我进入classB.DoSomething()时,classA实例就在那里,我可以看到它被正确存根。

在classB.DoSomething(int empId)

classA.GetEmployee(empId);

以上是对classA.GetEmployee()的真实调用。不应该只返回null而不是尝试执行真正的代码吗?

我确实尝试了存根GetEmployee():

stubClassA.GetEmployee = (value) => new Employee();

但它会抛出编译时错误:

Cannot assign to 'GetEmployee' because it is a 'method group'

ClassA中GetEmployee的签名

public Employee GetEmployee(int empId)

任何想法我做错了什么?

1 个答案:

答案 0 :(得分:1)

您需要确保您的ClassA实现了一个接口,以便MS Fakes可以为它实现一个存根。

我把一个小例子放在一起:

namespace TestLib
{
    public class Employee
    {
        public int Id;
    }

    public interface IClassA
    {
        Employee GetEmployee(int empId);
    }
    public class ClassA : IClassA
    {
        public Employee GetEmployee(int empId)
        {
            return new Employee(){Id = empId};
        }
    }

    public class ClassB
    {
        private IClassA _classA;

        public ClassB(IClassA a)
        {
            this._classA = a;
        }

        public void DoSomething(int id)
        {
            _classA.GetEmployee(id);
        }
    }
}

现在你可以像这样存根ClassA:

var b = new StubIClassA()
{
    GetEmployeeInt32 = (val) => new StubEmployee()
};