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
。
那么您的代码将更具可读性和易于维护。
我对 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
。
那么您的代码将更具可读性和易于维护。