Por que o Fakes executa o método real?
-
22-12-2019 - |
Pergunta
Eu esbocei uma classe usando MS Fakes.Esta classe é injetada em outra classe que não está em stub:
var stubClassA = new MyNamespace.Fakes.StubClassA();
ClassB classB = new ClassB(stubClassA);
classB.DoSomething(10);
Quando entro em classB.DoSomething(), a instância classA está lá e posso ver que ela está em stub corretamente.
Na classeB.DoSomething(int empId)
classA.GetEmployee(empId);
O texto acima faz uma chamada real para classA.GetEmployee().Isso não deveria apenas retornar nulo e não tentar executar o código real?
Eu tentei stub GetEmployee():
stubClassA.GetEmployee = (value) => new Employee();
mas gera o erro de tempo de compilação:
Cannot assign to 'GetEmployee' because it is a 'method group'
Assinatura de GetEmployee na Classe A
public Employee GetEmployee(int empId)
Alguma idéia do que estou fazendo de errado?
Solução
Você precisa garantir que sua ClassA implemente uma interface, para que o MS Fakes possa implementar um stub para ela.
Um pequeno exemplo que juntei:
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);
}
}
}
Agora você pode eliminar ClassA assim:
var b = new StubIClassA()
{
GetEmployeeInt32 = (val) => new StubEmployee()
};
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow