Jak konfigurować emulatory Android dla początkujących

works on my machine

Konfiguracja emulatora Android może być czasami problematyczna. Dlatego chciałbym przedstawić jak to zrobić poprawnie tak żeby wszystko działało.

Jest to artykuł skierowany głównie do początkujących developerów Xamarin i nie tylko.

Emulatory Android

Jeżeli chodzi o emulatory android mamy kilka możliwych opcji do wyboru

Dzisiaj chciałbym się skupić na emulatorach dostarczanych wraz z Android SDK, czyli Google APIs Intel x86.

HAXM

HAXM, czyli Intel Hardware Accelerated Execution Manager jest to technologia firmy Intel „usprawniająca działanie emulatorów Android na komputerach wyposażony w procesory Intel.

Intel® Hardware Accelerated Execution Manager (Intel® HAXM) is a hardware-assisted virtualization engine (hypervisor) that uses Intel® Virtualization Technology (Intel® VT) to speed up Android* app emulation on a host machine. In combination with Android x86 emulator images provided by Intel and the official Android SDK Manager, Intel HAXM allows for faster Android emulation on Intel VT enabled systems.

Intel® Hardware Accelerated Execution Manager (Intel® HAXM)

Dzięki wykorzystaniu technologi Intel VT emulatory dostarczane przez Google we współpracy działają z pełną szybkością procesora dostępnego w komputerze.

Przygotowanie środowiska

W celu pobrania najnowszych emulatorów musimy otworzyć Android SDK Manager, możemy to zrobić z poziomu Visual Studio VS Android SDK manager
Wybieramy emulator, który nas interesuje i pobieramy wraz z odpowiednim SDK. Ważne żebyśmy wybrali emulator w wersji x86 Atom
Google APIs System Image

No dobrze ale możecie zapytać co z tym całym HAXM?
Z moich obserwacji wynika, że najlepiej jest zainstalować HAXM dostarczany wraz z Visual Studio 2017.
Intel HAXM

Obserwacje zostały przeprowadzone na komputerze wyposażonym w procesor Intel i5-6300U.

Konfiguracja emulatora

W celu stworzenia nowego emulatora otwieramy Android Virtual Device (AVD) Manager, możemy to zrobić z poziomu Visual Studio VS AVD manager
AVD Manager

Następnie klikamy Create i wybieramy Device (głównie godzi tu o wymiary UI i ilość pamięci), oraz Target API level
new emulator

Ważne żebyśmy wybrali opcję Use Host GPU emulator działa wtedy jeszcze szybciej, przynajmniej na mojej maszynie.

Xamarin Live Player, podgląd UI na żywo - obecny stan

Xamarin Live Player, podgląd UI na żywo – obecny stan

Jakiś czas temu Xamarin opublikował narzędzie o nazwie Xamarin Live Player, szczegóły można znaleźć pod URL www.xamarin.com/live. Dzisiaj pokażę wam jak wygląda w praktyce użycie tego narzędzia i jakie są jego zalety, wady, oraz ograniczenia na chwilę obecną.

Xamarin Live Player – Setup

Na chwilę obecną Xamarin Live Player jest dostępny tylko w wersji Preview Visual Studio 2017, a więc zaczynamy instalację.

Na początek trzeba pobrać Visual Studio 2017 Preview 15.3 z tego linka www.visualstudio.com/vs/preview/. W ten sposób zainstalujemy instalator Visual Studio. Ważna uwaga wersja Preview może działać obok stabilnej wersji Visual Studio 2017 w czasie instalacji wystarczy stworzyć „Installation nickname”. Installation nickname
Wybieramy Workload Mobile Development with .Net i rozpoczynamy instalację.

Kolejny krok to instalacja Xamarin Updater. Jest to bardzo przydatne narzędzie ze względu na zmianę sposobu aktualizacji Xamarin wraz z wypuszczeniem Visual Studio 2017. Samo narzędzie możemy pobrać z marketplace.visualstudio.com.

Pierwsza aplikacja – czy wszystko nam działa?

Otwieramy Visual Studio Preview i tworzymy nowy projekt nazwijmy go „TodoLivePlayer”

LivePlayerDemo

Kolejny krok to instalacja na urządzeniu z iOS lub Android aplikacji Xamarin Live, którą można pobrać ze sklepu

Teraz możemy sparować urządzenie z Visual Studio w tym celu otwieramy menu Tools -> Xamarin Live Player -> Manage Devices

Manage devices
pair device

Na urządzeniu otwieramy aplikację i jeżeli jest ono wyposażone w aparat możemy przeczytać wygenerowany kod QR w innym wypadku trzeba przepisać kod wygenerowany na urządzeniu do Visual Studio.

Xamarin Live QR code

Xamarin Live

Cały proces jest mało problematyczny i przebiega bardzo płynnie.

Co obecnie działa?

Głównie testowałem Live Player na iPhone i na chwilę obecną jest jedno w mojej opinii niewielkie ograniczenie nie działa to z PCL. Jak tylko sprawdzę .Net Standard to pojawi się aktualizacja.

W ramach podsumowania

Live Player jest kolejnym ciekawym narzędziem ułatwiającym pracę z Xamarin. Bardzo ułatwia i przyśpiesza pracę na aplikacjami i jego powstanie\rozwój jest kolejnym przykładem, że Xamarin jest ważną i przyszłościową platformą.

WażneNależy również pamiętać, że urządzenia na których chcemy robić testy musi znajdować się w naszej sieci Wi-Fi.

Szkice, rysunki, prototyp, czyli jak to wszystko się zaczyna

Szkice, rysunki, prototyp, czyli jak to wszystko się zaczyna

Każdy projekt informatyczny, lepiej brzmi IT ma gdzieś swój początek. Przeważnie jest to głowa projektanta, analityka, itd.

No dobrze ale jak to wszystko dokładnie poprowadzić z punktu A do Z? I jak to wygląda w wypadku 10 Ideas.
Na początek mockupy ekranów. Zaznaczam, że nie jestem profesjonalnym grafikiem i staram się jak mogę :).

Mockup

Tak wyglądają pierwsze szkice UI aplikacji. Nie wygląda to zbyt obiecująco ale na początek chciałbym stworzyć działający prototyp.

Stąd też moja prośba będę poszukiwał chętnych do testowania i podpowiadania jakie funkcjonalności jeszcze mogą się przydać. Zapraszam do kontaktu.

Jak sobie radzić z gigantycznymi metodami

Jak sobie radzić z gigantycznymi metodami

Ile to razy otwieraliśmy jakiś kawałek kodu i nagle szok. Metoda ma 300 linijek i z 6 zmiennych. Jak sobie radzić z gigantycznymi metodami? Przedstawię kilka wypracowanych przepisów na radzenie sobie z legacy code. Nie będą one związane z jakimiś konkretnymi wzorcami itp…

Cały kod jest dostępny na GitHub.

Gigantyczne metody

Tak powiem w tajemnicy, że największa metoda z jaką miałem do tej pory do czynienia miała łącznie 9009 linijek i przyjmowała 25 parametrów. Podręcznikowy przykład clean code.

Według mnie metoda zaczyna się robić za duża gdy nie mieści się w 10 linijkach, oraz ilość parametrów jest większa niż 3.

Co z tym zrobić

Ogarnięcie wielu parametrów

Z parametrami możemy sobie dość łatwo poradzić tworząc prostą klasę POCO i przekazać jako parametr.

Poniżej przykład takiej metody. Do demonstracji specjalnie wybrałem VB.NET ze względu na znikome wsparcie dla refactor ze strony VS.

Function DoSuperComplicated(ByVal param1 As String, ByVal param2 As String, ByVal param4 As Boolean, ByVal param5 As Boolean, ByVal param6 As Integer, ByVal param7 As String, Optional ByVal param8 As String) As Boolean
        If param4 Then
            'Do something
            Select Case param2
                Case "Somevalue"
                    While continueValue
                        'Do Something
                        If param5 Then
                            'Do something
                        ElseIf param6 = 1 Then
                            'Do something
                        End If
                    End While
            End Select
        End If

        Return True
    End Function

A więc bierzemy się za poprawę takiego kodu. Tworzymy klasę POCO i zmieniamy sygnaturę naszej metody.

Public Class Parameters
    Public Property Param1() As String

    Public Property Param2() As String

    Public Property Param4() As Boolean

    Public Property Param5 As Boolean

    Public Property Param6 As Integer

    Public Property Param7 As String

    Public Property Param8 As String
End Class
...
    Function DoSuperComplicated(ByVal parameters As Parameters) As Boolean
        If parameters.Param4 Then
            'Do something
            Select Case parameters.Param2
                Case "Somevalue"
                    While continueValue
                        'Do Something
                        If parameters.Param5 Then
                            'Do something
                        ElseIf parameters.param6 = 1 Then
                            'Do something
                        End If
                    End While
            End Select
        End If

        Return True
    End Function
...

Co w sytuacji gdy dostajemy wymaganie od klienta ze zmianą logiki albo stworzenie nowej funkcjonalności? Nie wiemy co robi obecna metoda i biznes również nie jest nas w stanie na to naprowadzić.

Pierwsza myśl, która przychodzi do głowy to zaorać… Później w gąszczu przekleństw i złorzeczeń wobec innych programistów przychodzi inny pomysł do głowy.

Tworzymy coś nowego

W sytuacji jak powyższa staram się stworzyć bibliotekę w C# obok obecnego rozwiązania. Zyskujemy tym możliwość „panowania” nad kodem, oraz możliwości jego testowania.

Poniżej przykład jak można to osiągnąć.

    Private continueValue As Boolean = True

    Function DoSuperComplicated(ByVal parameters As Parameters) As Boolean
        Dim externalLogic As SomethingNew = New SomethingNew()

        If parameters.Param4 Then
            'Do something
            Select Case parameters.Param2
                Case "Somevalue"
                    While continueValue
                        'Do Something
                        externalLogic.DoSomethingNew(True)

                        If parameters.Param5 Then
                            'Do something
                        ElseIf parameters.Param6 = 1 Then
                            'Do something
                        End If
                    End While
            End Select
        End If

        Return True
    End Function

Definicja przykładowej logiki w C#

    public class SomethingNew
    {
        /// <summary>
        /// Do something new
        /// </summary>
        /// <param name="proceed">Mark process to execute some custome logic</param>
        public void DoSomethingNew(bool proceed)
        {
            //Do Something
        }
    }

Ulga

Jak widzicie można sobie poradzić z legacy code w całkiem prosty sposób. Nie ma sensu brnąć tygodniami w starym zabagnionym kodzie lepiej, szybciej i taniej będzie zrobić coś z boku.

A więc nie bądźcie przerażeni jak widzicie takie potworki w swojej pracy tylko do dzieła bo to jest proste.

Rebranding projektu i zmiana koncepcji blog-a

Rebranding projektu i zmiana koncepcji blog-a

Ostatnio dużo myślałem nad rebrandingiem projektu i zmianą koncepcji blog-a, co chciałbym nim przekazać, oraz co dalej z 10Things. Po takim głębokim zastanowieniu i rozmyślaniach nadeszła chwila na implementację.

Zmiana koncepcji blog-a

Na co dzień pracuję przy aplikacjach enterprise i widzę u młodych programistów swego rodzaju obrzydzenie do tzw. brownfield. Nie ukrywajmy programiści na co dzień wolą tzw. greenfield. Pracę przy nowościach i najnowszych framework-ach.

Niestety ponura rzeczywistość jest trochę inna. W pracy spotykamy się z wielkimi kobyłami, które mają wielu autorówojców. Nierzadko są kiepsko napisane bo już zabrakło czasu i budżetu na refactor.

Chciałbym zmienić ten stan rzeczy i pokazać, że ten enterprise i legacy code nie taki straszny. Można również na jego bazie tworzyć ciekawe rozwiązania i często spotykane problemy są bardzo interesujące.

10Things rebranding

Rebranding

proces transformacji wszystkich elementów marki, takich jak oferowane produkty i usługi, jakość obsługi oraz sposób komunikacji, w tym wygląd logo, by osiągnąć lepszą pozycję marki na rynku. Samej zmiany wyglądu logo nie można nazwać rebrandingiem, jest to bowiem jedynie zmiana identyfikacji wizualnej, od niewielkiego liftingu po całkowitą zmianę symboli graficznych marki. Natomiast proces rebrandingu strategicznego, wiążącego się z wdrożeniem nowej strategii przedsiębiorstwa, nie musi wiązać się ze zmianą nazwy czy całkowitą wymianą logo

No właśnie nadal szukam pomysłu na nazwę projektu\produktu. W każdym bądź razie zaczynam pracę nad projektem od początku z nowymi pomysłami i koncepcją na cały marketing wokoło.

Będę opisywał cały proces na bieżąco na blogu. Począwszy od etapu nauki Xamarin.Forms, aż po marketing.
Ma to stanowić swego rodzaju przewodnik dla młodych programistów jak mogą podejść do stworzenia czegoś swojego. Gdzie szukać informacji, jak promować produkt i jak go wdrożyć do sklepów.

Przyszłość…?

Co przyniesie przyszłość pożyjemy zobaczymy.

Jak widzicie mam parę pomysłów, które będą sukcesywnie odpalane teraz zostaje tylko kwestia czasu, chęci i samozaparcia.
Najważniejsze z nich są opisane powyżej jest jeszcze parę pobocznych. Może dobrym pomysłem jest implementacja swoich własnych Trzech poziomów?

Daj Się Poznać, 10Things i restart

Daj Się Poznać, 10Things i restart

A więc konkurs Daj Się Poznać dobiegł końca, a więc czas na podsumowanie sukcesów i porażek.

Sukces

Zacząłem pisać blog-a i aplikację w Xamarin.Forms. Wreszcie usiadłem do tego tak na poważnie i starałem się to robić w miarę systematycznie. Wziąłem też udział w swoim pierwszym konkursie dla programistów ever… Niestety przyszła…

Porażka

Niestety dosięgła mnie tzw. proza życia i codzienne obowiązki, których nie umiałem pogodzić z blogiem, konkursem i projektem.

Jako, że jednym z moich celów jest spędzać jak najwięcej czasu z rodziną. Nie potrafiłem tego pogodzić, wieczorem niestety pojawiało się zmęczenie po całym dniu i na pewnym etapie coś w rodzaju wypalenia. Akurat w tym okresie praca 8h na etacie też dało mi bardzo w kość.

Niektórzy nazwą to wymówkami ale cóż takie życie i u mnie tak to wyglądało.

Co dalej

Pora się przeorganizować i zacząć wszystko na spokojnie od początku, iść do przodu zgodnie ze swoimi celami. Możliwe, że stworzę sobie listę coś na wzór Trzy poziomy.

Zrobiłem restart projektu i zacząłem pisać od początku tym razem spokojniej i mam nadzieję bardziej systematycznie. Będzie to obecnie to mój tzw. „pet project” robiony po godzinach i w wolnym czasie. Nic na siłę ale mam nadzieję, że tego nie porzucę.

Dzięki konkursowi spojrzałem na blog i to co robię po godzinach w bardziej dojrzały sposób w pewnym sensie też usystematyzowałem swoje plany.

Blog

Będę chciał się skupić na tym co umiem najlepiej i znam z autopsji, pisać o życiu programisty w światku aplikacji enterprise. Miłość do Xamarin.Forms nadal jest aktualna ale chciałbym to ująć również bardziej z perspektywy dużego biznesu.

10Things

Prace nad projektem będą trwały nadal w tym celu powstał nowy branch na GitHub. Powstała również nowa lista Issues.

Tylko pewnie tempo prac spadnie albo i nie poczekamy zobaczymy.

Podsumowanie tygodnia odc.7

Podsumowanie tygodnia odc.7

A więc mamy już piątek 05.05 więc czas na podsumowanie tygodnia odc.7. Za nami dziewiąty tydzień zmagań w Daj Się Poznać. A więc czas na garść moich sukcesów i porażek minionego tygodnia. Dzisiaj wyjątkowo będzie bez linków i w trochę innej formie niż zazwyczaj.

Podsumowanie tygodnia odc.7

Co się udało

W tym tygodniu znowu spędziłem dużo czasu nad xUnit i… Zdałem sobie sprawę, że spora część kodu aplikacji będzie do przerobienia. Chciałbym utrzymać projekt w duchu TDD.

Co się nie udało

Nie udało mi się pchnąć samego tematu Xamarin.Forms do przodu ale za to wszedłem głębiej w xUnit.

Podsumowanie

A więc nadszedł czas zmian, oraz pogodzenia się z tym, że do końca konkursu nie dam rady ukończyć aplikacji. Nadal pozostaje dobrej myśli i chce zgłębiać tajniki Xamarin.Forms.

xUnit Theory: Jak używać InlineDate, ClassData lub MemberData

xUnit Theory: Jak używać InlineData, ClassData oraz MemberData

Ciąg dalszy cyklu o xUnit, oraz testowaniu aplikacji mobilnych w Xamarin.Forms.

Dzisiaj chciałbym omówić zastosowanie, oraz pokazać parę przykładów użycia Theory.

xUnit Theory: Jak używać InlineData, ClassData oraz MemberData

Czym jest Theory

Testy z atrybutem Theory umożliwiają nam przekazanie jako parametr danych wejściowych (może to być również kolekcja parametrów). Natomiast ich wynik jest poprawny tylko dla konkretnych dany wejściowych, czyli za jednym zamachem możemy przetestować pozytywne i negatywne przypadki.

Jak przekazać dane do metody

Żeby przekazać dane do metody możemy użyć jednego z 3 atrybutów InlineData, ClassData lub MemberData.

  • InlineData – umożliwia nam przekazanie danych typów prostych string, int, decimal, itd.
  • ClassData – umożliwia nam przekazanie typów złożonych
  • MemberData – umożliwia nam przekazanie typów złożonych z tą różnicą, że nie wymaga definiowania nowej klasy. Może to być dowolny obiekt, który zwraca IEnumerable

Przykłady użycia

Poniżej kilka przykładów implementacji każdego typu atrybutu.

InlineData

        [Theory]
        [InlineData("2017-04-15")]
        [InlineData("2017-04-16")]
        [InlineData("2017-04-17")]
        public async void CanGetDifferentProblemsForEachDayWhichIsNotNull(DateTime currentDate)
        {
            //Arrange
            IDataService service = new MockDataService();

            //Act
            Problem problem = await service.GetProblemByDateAsync(currentDate);

            //Assert
            Assert.NotNull(problem);
        }

ClassData

    public class TodoItemsTestData : IEnumerable<object[]>
    {
        private readonly List<object[]> data = new List<object[]>
        {
            new object[] { Guid.NewGuid(), string.Empty, false, null},
            new object[] { Guid.NewGuid(), "Buy tickets for movie", false, null },
            new object[] { Guid.NewGuid(), string.Empty, false, null },
            new object[] { Guid.NewGuid(), "Buy a milk", true, null },
        };

        public IEnumerator<object[]> GetEnumerator() => data.GetEnumerator();

        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
    }
....
        [Theory]
        [ClassData(typeof(TodoItemsTestData))]
        public async void CantAddTodoItemWithoutTitle(Guid id, string title, bool done, DateTime? dueDate)
        {
            //Arrange
            DataService service = new DataService();
            TodoItem item = new TodoItem { Id = id, Name = title, Done = done, DueDate = dueDate };

            //Act
            var ex = await Assert.ThrowsAsync<ArgumentException>(() => service.AddTodoItemAsync(item));

            //Assert
            Assert.IsType<ArgumentException>(ex);

MemberData

    public class TodoTheoryData<T> : TheoryData<T>
    {
        public TodoTheoryData(IEnumerable<T> data)
        {
            foreach (T t1 in data)
            {
                Add(t1);
            }
        }
    }
    public class DataServiceTests
    {
        private static TodoItem[] todoItems = new TodoItem[]
        {
            new TodoItem { Id = Guid.NewGuid(), Name = "Buy a milk", Done = false, DueDate = null},
            new TodoItem { Id = Guid.NewGuid(), Name = "Buy a TV", Done = false, DueDate = null},
            new TodoItem { Id = Guid.NewGuid(), Name = "Buy a new iPhone", Done = false, DueDate = DateTime.Today},
            new TodoItem { Id = Guid.NewGuid(), Name = "Buy a pomodoro", Done = false, DueDate = null},
            new TodoItem { Id = Guid.NewGuid(), Name = "Buy a bread", Done = false, DueDate = null}
        };

        public static TodoTheoryData<TodoItem> TodoItemsData { get; } = new TodoTheoryData<TodoItem>(todoItems);

        [Theory]
        [MemberData(nameof(TodoItemsData))]
        public async void InStorageAreFiveItems(TodoItem item)
        {
            //Arrange
            DataService service = new DataService();
            await service.AddTodoItemAsync(item);

            //Act
            IEnumerable<TodoItem> todoItems = await service.GetAllAsync();

            //Assert
            Assert.Equal(5, todoItems.Count());
        }
    }

Podsumowanie

Jak widzicie użycie Theory daje nam dużo benefitów i ułatwia nam testowanie aplikacji mobilnych napisanych w Xamarin.Forms ale i nie tylko.

Z użyciem xUnit możemy testować całą pulę aplikacji na platformie .Net od aplikacji Desktop, Mobile aż po Web.

Pomocne linki

Jeżeli chcecie poczytać coś więcej o xUnit Theory to odsyłam was do poniższych linków:

Podsumowanie tygodnia odc.6

Podsumowanie tygodnia odc.6

A więc mamy już piątek 28.04 więc czas na podsumowanie tygodnia odc.6. Za nami ósmy tydzień zmagań w Daj Się Poznać. A więc czas na garść moich sukcesów i porażek minionego tygodnia, oraz kilka linków które wydały mi się ciekawe.

Podsumowanie tygodnia odc.6

Co się udało

Zrobiłem całkiem spory kawałek testów jednostkowych w xUnit, oraz nauczyłem się używać go testowania aplikacji pisanych w Xamarin.Forms.

Co się nie udało

Nie udało mi się zaimplementować ekranu kalendarza, oraz części lokalnej bazy danych. Te dwa punkty będą do zrealizowania w najbliższym tygodniu.

Ciekawe linki tygodnia

Podsumowanie

Do zobaczenia za tydzień w kolejnym odcinku Podsumowania Tygodnia

3 najważniejsze słowa w xUnit

3 najważniejsze słowa w xUnit

Aplikacje stają się coraz bardziej skomplikowane, zawierają mnóstwo logiki biznesowej dlatego testy jednostkowe w naszych aplikacjach są ich ważnym aspektem. Dzisiaj chciałbym wam przedstawić 3 najważniejsze słowa w xUnit.

3 najważniejsze słowa w xUnit

Fact, Theory, Assert – Arrange, Act, Assert

Każdy test powinien mieć odpowiednią strukturę. Dlatego ja zawsze dziele je na etap inicjalizacji Arrange, etap wykonania Act i etap porównania wyników Assert.

Przykładowa metoda do testów może mieć następującą strukturę

public void TestMethod1()
{
    //Arrange

    //Act

    //Assert
}

Fact

Jest to podstawowy typ testu w xUnit. W porównaniu do innych framework-ów każdy test stanowi odrębną jednostkę. W każdym z nich należy zainicjalizować wymagane komponenty jak również zapewnić obsługę rollback.

Poniższy przykład ma na celu przetestowanie warstwy serwisu naszej aplikacji i mechanizmu pobierania danych na konkretną datę.

Metoda ta składa się z sekcji inicjalizacji Arrang, wykonania Act, oraz sprawdzenia warunku Assert.

        [Fact]
        public async void CanGetProblemForDate_20170415()
        {
            //Arrange
            DateTime expected = new DateTime(2017, 04, 15);
            DateTime actual = DateTime.Today;
            IDataService service = new MockDataService();

            //Act
            Problem problem = await service.GetProblemByDateAsync(new DateTime(2017, 04, 15));
            actual = problem.CreationDate;

            //Assert
            Assert.Equal(expected, actual);
        }

Theory

Co w sytuacji kiedy chcemy przetestować kolekcję przypadków testowych? Z pomocą przychodzi nam słówko Theory umożliwia ono nam dostarczenie parametrów wejściowych dla metody testowej.

Przykład użycia możecie zobaczyć na listingu poniżej.

        [Theory]
        [InlineData("2017-04-15")]
        [InlineData("2017-04-16")]
        [InlineData("2017-04-17")]
        public async void CanGetDifferentProblemsForEachDayWhichIsNotNull(DateTime currentDate)
        {
            //Arrange
            IDataService service = new MockDataService();

            //Act
            Problem problem = await service.GetProblemByDateAsync(currentDate);

            //Assert
            Assert.NotNull(problem);
        }

Jeżeli jest nam potrzebny bardziej zaawansowany sposób użycia Theory w którym przekazujemy nasz obiekt jako parametr wejściowy możemy użyć do tego klasy TheoryData.

Przykład użycia na poniższym listingu testuje nam dodawanie kolejnych TodoItem do naszej warstwy serwisu.

    public class DataServiceTests
    {
        private static TodoItem[] todoItems = new TodoItem[]
        {
            new TodoItem { Id = Guid.NewGuid(), Name = "Buy a milk", Done = false, DueDate = null},
            new TodoItem { Id = Guid.NewGuid(), Name = "Buy a TV", Done = false, DueDate = null},
            new TodoItem { Id = Guid.NewGuid(), Name = "Buy a new iPhone", Done = false, DueDate = DateTime.Today},
            new TodoItem { Id = Guid.NewGuid(), Name = "Buy a pomodoro", Done = false, DueDate = null},
            new TodoItem { Id = Guid.NewGuid(), Name = "Buy a bread", Done = false, DueDate = null}
        };

        public static TodoTheoryData<TodoItem> TodoItemsData { get; } = new TodoTheoryData<TodoItem>(todoItems);

        [Theory]
        [MemberData("TodoItemsData")]
        public async void InStorageAreFiveItems(TodoItem item)
        {
            //Arrange
            DataService service = new DataService();
            await service.AddTodoItemAsync(item);

            //Act
            IEnumerable<TodoItem> todoItems = await service.GetAllAsync();

            //Assert
            Assert.Equal(5, todoItems.Count());
        }
    }

    public class TodoTheoryData<T> : TheoryData<T>
    {
        public TodoTheoryData(IEnumerable<T> data)
        {
            foreach (T t1 in data)
            {
                Add(t1);
            }
        }
    }

Assert

Klasa Assert dostarcza nam implementację różnych metod wykorzystywanych do sprawdzania naszych wyników, oraz np. oczekiwanych wyjątków.

Podsumowanie

Jak widzicie w prosty sposób można testować aplikacje Xamarin.Forms z użyciem xUnit. Kolejny punkt na liście projektu 10Things to dodanie źródła danych offline z wykorzystaniem bazy SQLite lub Realm.

Tutaj pytanie do czytelników, która baza oferuje lepszy mechanizm synchronizacji offline-online.