Я недавно начал работать над приложением Xamarin.Forms для iOS и Android.Я добавил проект модульного тестирования с пакетами xUnit.
На данный момент приложение имеет один вид и одну модель представления.Я хотел все связать.таким образом, у модели представления есть только одно свойство.свойство инициализируется в string.empty.Так что я просто проверяю, чтобы убедиться, что это не ноль.Viewmodel зависит от NagivationService.
в моем App.xaml.cs - view и viewmodel зарегистрированы для навигации.
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation<NavigationPage>();
containerRegistry.RegisterForNavigation<ViewAPage, ViewAPageViewModel>();
}
Я создал макет приложения
public class AppMock : App
{
public AppMock(IPlatformInitializer initializer)
: base(initializer) {}
// Added as a work around
public new INavigationService NavigationService => base.NavigationService;
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
base.RegisterTypes(containerRegistry);
containerRegistry.Register<ILoggerFacade, XunitTestOutputLogger>();
}
}
Тестовое устройство
public class ViewAViewModelFixture : FixtureBase, IDisposable
{
public ViewAViewModelFixture(ITestOutputHelper testOutputHelper)
: base(testOutputHelper) {
}
private AppMock CreateApp()
{
var initializer = new XunitPlatformInitializer(_testOutputHelper);
return new AppMock(initializer);
}
protected AppMock App
{
get
{
if ( app == null )
{
this.App = CreateApp();
}
return this.app;
}
set
{
this.app = value;
}
}
private AppMock app;
[Fact]
public void Email_IsEmpty()
{
ViewAViewModel vm = (ViewAViewModel)this.App.Container.Resolve(typeof(ViewAViewModel));
string email = vm.Email;
Assert.Equal(expected: string.Empty, actual: email);
}
public void Dispose()
{
PageNavigationRegistry.ClearRegistrationCache();
}
}
Когда я пытаюсь выполнить вышеуказанный тест, я получаю следующую ошибку:
Message: Unity.Exceptions.ResolutionFailedException : Resolution of the dependency failed, type = 'App.ViewModels.ViewAViewModel', name = '(none)'.
Exception occurred while: while resolving.
Exception is: InvalidOperationException - The current type, Prism.Navigation.INavigationService, is an interface and cannot be constructed. Are you missing a type mapping?
Я не уверен, что мне не хватает,Когда я запускаю приложение локально в эмуляторе Android или iOS, оно работает нормально.поэтому я попробовал следующее:
[Fact]
public void Email_IsEmpty()
{
var app = this.App;
var NavService = app.NavigationService;
NavService.NavigateAsync("/ViewA");
ViewA view = (ViewA)this.App.MainPage;
Assert.IsType<ViewAViewModel>(view.BindingContext);
ViewAViewModel vm = view.BindingContext as ViewAViewModel;
string email = vm.Email;
Assert.Equal(expected: string.Empty, actual: email);
}
этот тест пройден, а другой, очевидно, не пройден.
Кто-нибудь видит, чего мне не хватает?