Я пытаюсь обобщить некоторый тестовый код в решении с проектом MVC. Поскольку мы пишем один и тот же тест для каждого контроллера, я подумал, что могу использовать дженерики, чтобы сделать это так, что нужен был только один тест.

К сожалению, в настоящее время я получаю сообщение об ошибке: Error 1 The type 'TRepo' must be a reference type in order to use it as parameter 'T' in the generic type or method 'Moq.Mock<T>'

Вот соответствующий код. При необходимости я могу предоставить больше.

TestBase.cs

public class TestBase<TController, TObject, TRepo>
where TController : IRMCController<TObject>
where TRepo : IRMCRepository
{
    public Mock<TRepo> Repo { get; set; }
}

CompaniesTest.cs

public class CompaniesTest : TestBase<CompaniesController, Company, ICompanyRepository>

Спасибо за любую помощь.

3
Codeacula 20 Апр 2013 в 00:17

1 ответ

Лучший ответ

В Moq класс Mock<T> имеет ограничение class на свой универсальный тип. Вот как это определяется:

public class Mock<T> : Mock where T : class

Поэтому, если вы собираетесь использовать это в своем классе, вы должны определить такое же ограничение class в дополнение к IRMCRepository:

public class TestBase<TController, TObject, TRepo>
    where TController : IRMCController<TObject>
    where TRepo : class, IRMCRepository

{
    public Mock<TRepo> Repo { get; set; }
}

Теперь ваш код будет скомпилирован. Это базовый generic constraints на C #.

5
Darin Dimitrov 20 Апр 2013 в 00:31
Спасибо! Я проверю, когда вернусь домой. Я думал, что это мог быть Mock , но забыл посмотреть.
 – 
Codeacula
20 Апр 2013 в 00:57
Спасибо, Дарин! После некоторой другой настройки я заставил его работать. Очень признателен!
 – 
Codeacula
20 Апр 2013 в 03:14