Castle windsor 在单元测试中解析时使用 fakeiteasy 对象

Castle windsor to use a fakeiteasy object while Resolving in Unit test

我对 FakeItEasy 和 Castle Windsor 都很菜鸟,这就是为什么我在搜索时遇到问题 Google 因为我不知道要搜索的关键字。

现在进入问题

我有一个 class

public class PersonService : IPersonService
{
    IMarriageHelper objIMarriageHelper;
    IPersonRepository objIPersonRepository;
    public PersonService(IMarriageHelper objMarriageHelper, IPersonRepository objPersonRepository)
    {
        this.objIMarriageHelper = objMarriageHelper;
        this.objIPersonRepository = objPersonRepository;
    }

}

现在我正在使用 Castle Windsor 来解析单元测试用例中的 PersonService class。

        var objContainer = new WindsorContainer();
        objContainer.Register(Component.For<PersonService>());
        objContainer.Register(Component.For<IMarriageHelper>().ImplementedBy<MarriageHelper>());
        objContainer.Register(Component.For<IPersonRepository>().ImplementedBy<PersonRepository>());
        var objPersonService = objContainer.Resolve<PersonService>();

现在的问题是我想在解析 PersonService 而不是 MarraigeHelper 时发送 PersonRepository 的假对象。

请帮我解决这个问题,因为我对此很陌生。

在温莎城堡中,当您将多个组件注册到同一个接口时,Windsor 将解析第一个或标有 Default() 的组件。

有很多方法可以解决您的问题。我只会指出其中的几个......

使用姓名注册:

const string FAKE_REPOSITORY = "fake person repo";
var fakePersonRepository = A.Fake<IPersonRepository>();
objContainer.Register(Component.For<IPersonRepository>()
                               .Instance(fakePersonRepository)
                               .Named(FAKE_REPOSITORY));
const string PERSON_FOR_TEST = "person for test";
objContainer.Register(Component.For<PersonService>()
                               .DependsOn(Dependency.OnComponent(typeof(IPersonRepository), FAKE_REPOSITORY))
                               .Named(PERSON_FOR_TEST));

并解决此人服务:

var target = objContainer.Resolve<PersonService>(PERSON_FOR_TEST);

另一种选择是让您的 PersonService 依赖于 dynamic parameters 在这种情况下,您将 PersonService 解析为 fakePersonRepository

var target = objContainer.Resolve<PersonService>(<key name>, fakePersonRepository)

我可以考虑 3-4 个更多选项(工厂方法、这些方法之间的某些组合等...)但是,我认为构建 PersonService 测试的最佳方法是显式构建它不使用温莎 magic/use 温莎仅用于解析 IMarriageHelper。 那么您的代码将更具可读性和易于维护。