Menu / szukaj

Piszę dobry kod – InfoMEET Katowice 2017

Już w najbliższą sobotę (20.05) będzie można mnie posłuchać na konferencji InfoMEET Katowice 2017. Temat wykładu to Piszę dobry kod – czyli jak dbać o jakość kodu w naszym projekcie? W trakcie prezentacji wyjaśnię pojęcie jakość kodu, pokażę jak prostymi sposobami możemy ją zwiększyć. Jednak to nie wszystko. Największy nacisk położę na część praktyczną. Pokażę jak w prosty sposób narzędzia mogą pomóc nam dbać o nasz kod. Duży nacisk w trakcie przedstawiania przykładów będzie położony na efektywność tego procesu. Tak abyśmy mogli osiągnąć jak największą korzyść małym kosztem.

Serdecznie zapraszam!

DSP 2017 – nuget.download.stats – Sprint 1

Minął pierwszy tydzień Daj Się Poznać 2017. Czas na drobne podsumowanie. Projekt wystartował pomału. W repozytorium pojawił się kod, który wystawia WebAPI pozwalające na pobranie podstawowych informacji o paczkach.

Trochę czasu zeszło na zabawę z Visual Studio 2017.  Niestety nie działa ono tak dobrze jak myślałem. Liczyłem na to, że w końcu będzie można pracować normalnie z testami jednostkowymi. Ale tak się nie stało. Narzędzie wspiera pisanie testów w xUnicie. Pozwala je nawet uruchomić, ale liczyłem, że po premierze Visual Studia 2017 będzie działał już w pełni Resharper, ale tak się nie stało. Kolejna nowość, którą chciałem przetestować to Live Unit Testing, ale ta funkcjonalność również nie działa z .NET Core.

Zacząłem się również zastanawiać, czy zamiast Angulara 2/4 nie użyć jakiegoś lżejszego frameworka, ale decyzja jeszcze nie zapadła.

Pakiet Moq.EntityFramework.Helpers

Na blogu pojawiły się ostatnio dwa wpisy pokazujące w jaki sposób mnożna zamockować DbSet<TEntity> wykorzystując Moq:

Opisane rozwiązania połączyłem w jednej bibliotece i opublikowałem jako pakiet NuGet – Moq.EntityFramework.Helpers. Czytaj dalej

EntityFramework – testowanie zapytań asynchonicznych

Jakiś czas temu opisałem w jaki sposób można zamockować typy DbContext przy pomocy MoqMockowanie typów DbContext oraz DbSet z wykorzystaniem Moq. Temat ten nie został wtedy całkowicie wyczerpany. Pozostał jeden element do opisania – zapytania asynchoroniczne. Do tego elementu chciałbym dziś wrócić.

Punktem wyjście będzie poprzedni wpis – czyli mamy fragment kodu, który pozwala na zamockowanie DbSet<T>. Teraz tylko dodamy możliwość obsługi wywołań asynchronicznych. Aby to zrobić należy zaimplementować interfejs IDbAsyncQueryProvider:

public class InMemoryAsyncQueryProvider<TEntity> : IDbAsyncQueryProvider
{
  private readonly IQueryProvider innerQueryProvider;
  
  internal InMemoryAsyncQueryProvider(IQueryProvider innerQueryProvider)
  {
    this.innerQueryProvider = innerQueryProvider;
  }

  public IQueryable CreateQuery(Expression expression)
  {
    return new InMemeoryAsyncEnumerable<TEntity>(expression);
  }

  public IQueryable<TElement> CreateQuery<TElement>(Expression expression)
  {
    return new InMemeoryAsyncEnumerable<TElement>(expression);
  }

  public object Execute(Expression expression)
  {
    return this.innerQueryProvider.Execute(expression);
  }
  
  public TResult Execute<TResult>(Expression expression)
  {
    return this.innerQueryProvider.Execute<TResult>(expression);
  }

  public Task<object> ExecuteAsync(Expression expression, CancellationToken cancellationToken)
  {
    return Task.FromResult(Execute(expression));
  }

  public Task<TResult> ExecuteAsync<TResult>(Expression expression, CancellationToken cancellationToken)
  {
    return Task.FromResult(Execute<TResult>(expression));
  }
}

Czytaj dalej

Daj Się Poznać – Krótki wstęp

Kilka dni temu wystartowała kolejna edycja konkursu Daj Się Poznać. Trochę się zastanawiałem, czy wziąć w niej udział. Główną przeszkodą był jak zwykle kalendarz – praktycznie każdy weekend do końca maja zajęty oraz dodatkowo dwa wyjazdy zagraniczne (w tym jeden dłuższy). Nigdy na wakacje nie brałem laptopa, a tym razem chyba nie będzie wyjścia. Postanowiłem jednak spróbować – tym bardziej, że namawiałem Jurka i grzechem byłoby się nie zapisać. Mam nadzieję, że uda mi się dotrwać do końca. Potraktuję to jako wyzwanie.

Tyle o konkursie… Skupmy się na problemie.

Już od jakiegoś czasu próbuję przerzucić się na technologie webowe. Generalnie idzie mi to całkiem dobrze, ale cały czas mam niedosyt, że nigdy nie zacząłem takiego projektu od samego początku. Zawsze trafiałem już do projektów, gdzie większość rzeczy została już zdefiniowana. Z tego powodu stwierdziłem, że napiszę coś małego, gdzie będę mógł poznać każdy etap powstawania aplikacji. Technologicznie chciałem, aby wyjść poza strefę swojego komfortu oraz poznać nowe technologie. Wybór padł więc na: ASP.NET Core jako backend oraz Angular2 jako frontend (zastanawiam się jeszcze czy nie wykorzystać już Angulara4). Całość ma być hostowana w Azure.

I najważniejsze problem, który ma zostać rozwiązany – przygotowanie aplikacji, która pozwoli na śledzenie liczby ściągnięć pakietów z NuGeta. Dodatkowo chciałbym, aby istniała możliwość umieszczenia przycisku / obrazka na GitHubie, który będzie informował o aktualnej liczbie ściągnięć naszego pakietu.

Migracja z ASP.NET Core 1.0.x do 1.1

Od 17 listopada dostępna jest nowa wersja .NET Core 1.1. Wraz z nią pojawiły się nowe wersje ASP.NET oraz EntityFrameworka. Przyszedł, więc czas na aktualizację aplikacji do najnowszego środowiska. Proces ten powinien przebiegać bezboleśnie, ale nie do końca. W moim przypadku miałem problemy z dwoma elementami, co spowodowało, że aplikacja nie wystartowała od razu po aktualizacji.

Przed przystąpieniem do aktualizacji należy ściągnąć najnowszą wersją pakietów – zarówno SDK, jak i Runtime. Pakiety do ściągnięcia dostępne są na stronie .NET Core Downloads. Czytaj dalej

Przyspieszanie AutoFixture

O bibliotece AutoFixture wspominałem już ostatnio we wpisie Lightning talk – Autofixture. Biblioteka ta pomaga nam w tworzeniu obiektów w trakcie fazy Arrange w testach jednostkowych. Dzięki niej możemy skupić się na tym co rzeczywiście ma zostać przetestowane, a nie na tworzeniu obiektów, które są potrzebne do przeprowadzenia testu. Dodatkowo chroni ona nas przed niepotrzebną modyfikacją testów w momencie zmiany wykorzystywanych w testach obiektów.

Ma ona drobną wadę, w zależności od obiektów, które tworzymy za jej pomocą może ona spowodować znaczące wydłużenie trwania testów jednostkowych. W szczególności, gdy za jej pomocą tworzymy obiekty związane z EntityFrameworkiem. Czytaj dalej

.net DD 2016 – materiały

Od jakiegoś czasu dostępne są już na kanale YouTube materiały z konferencji .NET DeveloperDays 2016. Jeśli chodzi o mnie to w tym roku najlepszym prelegentem był Ted Neward. Szczególnie polecam sesję zamykającą. Nie jest to prezentacja ściśle techniczna, a raczej filozoficzna. W jej trakcie Ted pokazuje jak istotne znaczenie na ocenę sytuacji ma kontekst. Oraz jak trudno jest znaleźć najlepsze jednoznaczne rozwiązanie. Zresztą zobaczcie sami.

FluentValidation.Validators.UnitTestExtension

Chciałem Was zachęcić do używania biblioteki, którą ostatnio opublikowałem – FluentValidation.Validators.UnitTestExtension. Głównym jej celem jest rozszerzenie oraz uproszczenie możliwości testowania kodu, który wykorzystuje pakiet FluentValidation do walidacji obiektów.

Bibliotekę można zainstalować wykorzystując nugeta:


Install-Package FluentValidation.Validators.UnitTestExtension

lub ściągnąć kod z GithHuba.

Na wiki dotyczącej biblioteki FluentValidation można znaleźć propozycję pisania testów przygotowaną przez autorów biblioteki. W celu ułatwienia nam tego procesu autorzy przygotowali dwie metody ShouldHaveValidationErrorFor oraz ShouldNotHaveValidationErrorFor. Czytaj dalej