确实存在构造函数参数不存在的例外情况

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班上的顾问.请注意,它清楚地基于接口的实例需要ITfsVcQaCheckoutworkerITfsVcCheckinWorker.

 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)

任何人都可以告诉我我做错了什么.

Jef*_*f B 5

它说它找不到“接受参数的构造函数(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 参考。