use*_*057 7 c# integration-testing constructor exception unity-container
我试图通过使用Unity将基于接口的两个对象注入到类构造函数中.
单元测试时我当前收到以下错误:
结果消息:
测试方法TestProject.TFStests.Check_Interface_CheckOut_Method引发异常:System.InvalidOperationException:类型Adp.Tools.VersionControl.TfsVersionControl.TfsVcPromotionManager没有带参数的构造函数(TfsVcQaCheckoutWorker).
以下代码是我的Unity类,用于注册和解析TfsVCPromotionManager对象:
public class UnityClass
{
public static ITfsVcPromotionManager returnNewPromotionManager(
VersionControlServer tfServer)
{
var container = new UnityContainer();
ITfsVcQaCheckinWorker test1 = CreateUnityCheckInWorker();
ITfsVcQaCheckoutWorker test2 = CreateUnityCheckOutWorker(tfServer);
container.RegisterType<ITfsVcPromotionManager, TfsVcPromotionManager>(
new InjectionConstructor(test2), new InjectionConstructor(test1));
return container.Resolve<TfsVcPromotionManager>();
}
private static ITfsVcQaCheckinWorker CreateUnityCheckInWorker()
{
var container = new UnityContainer();
container.RegisterType<ITfsVcQaCheckinWorker, ITfsVcQaCheckinWorker>();
return container.Resolve<TfsVcQaCheckinWorker>();
}
private static ITfsVcQaCheckoutWorker CreateUnityCheckOutWorker(
VersionControlServer passedServer)
{
var container = new UnityContainer();
container.RegisterType<ITfsVcQaCheckoutWorker, TfsVcQaCheckoutWorker>(
new InjectionConstructor(passedServer));
return container.Resolve<TfsVcQaCheckoutWorker>();
}
}
Run Code Online (Sandbox Code Playgroud)
这是TfsVcPromotionManager班上的顾问.请注意,它清楚地基于接口的实例需要ITfsVcQaCheckoutworker和ITfsVcCheckinWorker.
private ITfsVcQaCheckoutWorker _checkOutWorker;
private ITfsVcQaCheckinWorker _checkInWorker;
public TfsVcPromotionManager(ITfsVcQaCheckoutWorker checkOutWorker,
ITfsVcQaCheckinWorker checkInWorker)
{
if (checkOutWorker == null || checkInWorker == null)
{
throw new NullReferenceException();
}
_checkOutWorker = checkOutWorker;
_checkInWorker = checkInWorker;
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我我做错了什么.
它说它找不到“接受参数的构造函数(TfsVcQaCheckoutWorker)”,这确实是一个真实的陈述。没有只接受一个参数的构造函数。我对 Unity 并不十分熟悉,但我敢打赌,您的问题可以通过更改以下内容来解决:
container.RegisterType<ITfsVcPromotionManager, TfsVcPromotionManager>(
new InjectionConstructor(test2),
new InjectionConstructor(test1))
Run Code Online (Sandbox Code Playgroud)
对此:
container.RegisterType<ITfsVcPromotionManager, TfsVcPromotionManager>(
new InjectionConstructor(test2, test1))
Run Code Online (Sandbox Code Playgroud)
有关 InjectionConstructor 的构造函数,请参阅 MSDN 参考。