C#: Moq System.NotSupportedException: невозможно применить комиссионные к компоненту, поскольку он выглядит как целевой целевой прокси - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь смоделировать службу и получаю следующую ошибку ниже в модульном тесте. Как это можно решить? Что означает эта ошибка? Это может быть что-то с await / asyn c?

services.AddSingleton(a =>
{
    var mock = new Mock<IUserResolverService>();
    mock.Setup(b => b.GetUser()).Returns(5);
    return mock.Object;
});

System.NotSupportedException: не может применить комиссионные к компоненту Common.Services.IUserResolverService_175a16cd-d798-4fbd-b343-1ba0eb5e0ad6, потому что это Похоже, что целевой прокси-сервер. В настоящее время те не поддерживаются. DefaultKernel.ResolveComponent (обработчик IHandler, служба типа, служба IDictionary AdditionalArguments, политика IReleasePolicy) IKernelInternal.Resolve (служба типа, аргументы IDictionary, политика IReleasePolicy) ScopedWindsorServiceProvider.GetServiceInternal * * 100 * 100 * 1005), логический тип Больше данных кода:

    private async Task<IServiceProvider> GetProvider()
    {
        var services = new ServiceCollection();
        services.AddSingleton(new Mock<ISharedServicesApiClient>().Object);
        services.AddSingleton(new Mock<IAddressValidator>().Object);
        services.AddSingleton(new Mock<IAddressValidationService>().Object);

        services.RegisterMappingProfiles(
            new PropertyManagementDataMappingProfile(),
            new ApplicationServicesMappingProfile()
        );
        services.AddSingleton(a =>
        {
            var mock = new Mock<IUserResolverService>();
            mock.Setup(b => b.GetUser()).Returns(5);
            return mock.Object;
        });

        services.AddDbContext<PropertyContext>(
            a => a.UseInMemoryDatabase("TestDb").UseQueryTrackingBehavior(QueryTrackingBehavior.TrackAll),
            ServiceLifetime.Singleton);

        services.AddDbContext<AuditablePropertyContext>(
            a => a.UseInMemoryDatabase("TestDb").UseQueryTrackingBehavior(QueryTrackingBehavior.TrackAll),
            ServiceLifetime.Singleton);
        services.AddSingleton<DbContext, AuditablePropertyContext>();

        services.AddSingleton<DbContext, PropertyContext>();
        services.AddSingleton<IAddressAppService, AddressAppService>();
        services.AddSingleton<IAddressRepository, AddressRepository>();
        services.AddSingleton<IPartyContactRepository, PartyContactRepository>();
        services.AddSingleton<IPartyMailingAddressRepository, PartyMailingAddressRepository>();

        var provider = services.GetServiceProvider();
        var db = provider.GetRequiredService<PropertyContext>();
        await db.AddTestData();
        return provider;
    }

    [Fact]
    public async Task AddNewAddressAlternateAddTest()
    {
        var provider = await GetProvider();
        var manager = provider.GetRequiredService<IAddressAppService>();
        var request =
            SitusAndPartyAddressDataSeed.GetSingleApnRequestForAdd(AddressType.Alternate);
        var result = await manager.UpdatePartyAndSitusAddresses(request);
        // new AddressId is 3
        Assert.True(result.Body == NewAddressId);

1 Ответ

1 голос
/ 01 мая 2020

Вслед за «догадкой» по некоторым причинам вы настраиваете синглтон для смоделированного экземпляра IUserResolverService, но, как написано, вы уникальным образом создаете и возвращаете этот смоделированный объект с помощью делегата, а не просто создаете один экземпляр завершенного макета и его регистрация вместо этого, как вы со всеми остальными. Учитывая сочетание синхронных и асинхронных операций, похоже, что ваш тест заставляет Moq бороться с жизненным циклом / созданием объекта.

Если мы изменим это:

services.AddSingleton(a =>
{
     var mock = new Mock<IUserResolverService>();
     mock.Setup(b => b.GetUser()).Returns(5);
     return mock.Object;
 });

На это :

var mock = new Mock<IResolverService();
mock.Setup(b => b.GetUser()).Returns(5);
services.AddSingleton(mock.Object);

Вместо этого вы передаете фактический единственный экземпляр макета, который может решить все, что вызывает проблему, будь то жизненный цикл или позднее связывание (или что-то еще, но эй).

...