Ошибка общего ограничения времени выполнения с Moq и NUnit - PullRequest
1 голос
/ 05 июля 2011

Я использую NUnit и Moq для тестирования класса, который использует универсальную оболочку клиента службы WCF Я написал , и я столкнулся с ошибкой, которую не могу понять. У меня есть следующий интерфейс:

public interface IService
{
    void Call();
}

... реализовано следующим сервисным клиентом:

public class ServiceClient : ClientBase<IService>, IService
{
    public void Call()
    {
    }
}

... и заключены в этот класс со следующими общими ограничениями:

public class ServiceClientWrapper<TClient, TService>
    where TClient : ClientBase<TService>, TService
    where TService : class
{
    public virtual TService CreateServiceClient()
    {
        return (TService)Activator.CreateInstance<TClient>();
    }
}

Чтобы сделать его тестируемым, у меня есть фабрика упаковщиков, над которой я могу издеваться. Интерфейс фабрики обёрток выглядит так:

public interface IServiceClientWrapperFactory
{
    ServiceClientWrapper<TClient, TService>
        CreateServiceClientWrapper<TClient, TService>()
        where TClient : ClientBase<TService>, TService
        where TService : class;
}

Я проверяю эту настройку, используя этот код:

// A mock IService to return from my mock service wrapper:
var mockService = new Mock<IService>();

// A mock client wrapper to return from my mock wrapper factory:
var mockClientWrapper = 
    new Mock<ServiceClientWrapper<ServiceClient, IService>>();
mockClientWrapper
    .Setup(mcw => mcw.CreateServiceClient())
    .Returns(mockService.Object);

// A mock wrapper factory to inject into a client object:
var mockClientWrapperFactory = new Mock<IServiceClientWrapperFactory>();
mockClientWrapperFactory
    .Setup(mcwf => mcwf.CreateServiceClientWrapper<ServiceClient, IService>())
    .Returns(mockClientWrapper.Object);

// Get the mock client wrapper from the mock wrapper factory - boom!
mockClientWrapperFactory.Object
    .CreateServiceClientWrapper<ServiceClient, IService>();

Ошибка:

GenericArguments [0], «TService», на 'ServiceClientWrapper`2 [TClient, TService] нарушает ограничение типа параметр 'TClient'.

Ограничения одинаковы, где бы я их ни указывал, он компилируется и работает просто отлично, ошибка не выдается, если я реализую IServiceClientWrapperFactory и запускаю его без Moq ... какие-нибудь идеи?

1 Ответ

2 голосов
/ 05 июля 2011

Я немного поиграл с кодом и получаю тот же результат.Насколько я могу судить, в ваших определениях нет ничего плохого.

Кажется, что это может быть ошибкой в ​​ Moq , при реализации mock, которые имеют различные комбинации общих ограниченийна них.

Я попытался удалить различные ограничения (и закомментировать или изменить код, как требуется).Кажется, если я удаляю TService из where TClient : ... , TService, то я не получаю эту ошибку.

Это, как представляется, еще раз подтверждается тем фактом, что в прошлом было много подобных ошибок:

К вашему сведению, версия, которую я использовал для воспроизведения вашей проблемы, была: Moq.4.0.10827, NET40 (не NET40-requireCastle) * * тысяча двадцать-один

...