2013-04-28 1 views
2


Я создаю кросс-платформенный проект с решениями MvvmCross v3 и Xamarin, и я хотел бы создать некоторые модульные тесты. This кажется немного устаревшим, поэтому я пытался следовать this, и он работал как ожидалось.MvvmCross: услуги модульного тестирования с плагинами

Тем не менее, теперь я пытаюсь выполнить тестирование некоторых моих сервисов домена, которые зависят от платформ MvvvCross (например, ResourceLoader).

Запуск результатов теста, за исключением следующего:

Cirrious.CrossCore.Exceptions.MvxException: Failed to resolve type 
Cirrious.CrossCore.Plugins.IMvxPluginManager. 

Я предполагаю, что IMvxPluginManager вероятно зарегистрирован в потоке установки, и что мне нужно включать реализацию платформенных плагин в моем проекте, но я был интересно, какой будет предпочтительный способ создания моего проекта модульного тестирования? Есть что-то, чего я не хватает?

Есть ли обновленный учебник для вышеуказанной задачи?

Есть ли какие-либо расширения платформ расширения, поддерживающие тестовую среду, или я должен попытаться написать их самостоятельно?

ответ

4

В общем, вы не должны загружать плагины или настоящие MvxPluginManager во время проведения своих сервисных испытаний.

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

var mock = new Mock<INeedToUse>(); 
// use mock.Setup methods 
Ioc.RegisterSingleton<INeedToUse>(mock.Object); 
// or you can use constructor dependency injection on INeedToUse instead 

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

+0

Привет, Стюарт, Спасибо, я сделаю попытку создать издевательства. Не создает ли макет для, скажем, IMvxPluginManager, на самом деле то же самое, что и реализация «Плагина» для проекта unit-tests? Предполагая, что моя тестируемая служба должна фактически загружать файл ресурсов ... – Liel

+0

Не видя вашей службы, я не уверен - но обычно я лично предпочитаю просто служить строкой из C# в своем тесте, а не добавлять файл ресурсов и полагаться на тестовый плагин. Если вы хотите написать макетный плагин, вы можете - может быть, мой «вы не должны» отвечать, это было сильно сформулировано - может быть, больше похоже на «я бы не» – Stuart

+0

Что делать, если вы действительно хотите протестировать настоящий плагин? Является ли это возможным? – tofutim

3

Этот сценарий должен быть вполне возможным. Я хотел выполнить UnitTest для моей службы SqlLite. Я сделал следующее, чтобы заставить его работать:

  • Создание тестового проекта блока Visual Studio
  • Добавить ссылку на .Core портативный Проект библиотеки
  • Добавить NuGet ссылка на MvvmCross Test Helper
  • Добавить ссылка самородок в MvvmCross SqlLite плагин (это будет использовать реализации WPF из SqlLite)

Скачать библиотеку SqlLite окна и скопировать их в тестовую р roject Sql Lite Download location И не забудьте добавить sqllite3.dll в корень вашего тестового проекта и установить «Копировать в библиотеку вывода» в «Копировать всегда». Это позволит убедиться, что фактическая база данных sqllite скопирована в расположение тестовой DLL-модуля. (Убедитесь, что DLL копируются в папку бен/отладки)

Затем написать вам модульное тестирование следующим образом:

[TestClass] 
public class SqlServiceTests:MvxIoCSupportingTest 
{ 
    private readonly ISQLiteConnectionFactory _factory; 

    public SqlServiceTests() 
    { 
     base.ClearAll(); 

     _factory = new MvxWpfSqLiteConnectionFactory(); 
     Ioc.RegisterSingleton<ISQLiteConnectionFactory>(_factory); 
    } 
    [TestMethod] 
    public void YourSqlLiteTest() 
    { 
     // Arrange 
     var si = new SqlDataService(_factory); 
     var list = si.GetOrderList(); 
    } 
} 

Я не проверял это с моей ViewModel. Используя метод IoC.RegisterSingleton, SqlConnectionFactory должен быть доступен для ваших моделей viewmodels.

+0

Блестящий, спасибо. Я один из тех парней, которые просто не делают модульное тестирование «правильного пути», но это работает для меня. В частности, мне нравится использовать SQLite в режиме «: memory:» для запуска тестов с фактическими данными (загруженными во время тестирования). Когда я пытался указать «: memory:» в качестве имени db, он жаловался, что не может создать базу данных в C: \ Users \ ... –