Wspominałem niedawno, że w pracy nie trzeba robić wszystkiego szablonowo. Można się postarać i uczyć, rozwijać siebie i innych. Nieważna jest firma, korporacja w której pracujesz. Nieważne jest stanowisko, które zajmujesz. Ważne jest tylko czy chcesz.
Dziś opiszę jak testować aplikację C# za pomocą F#. Po co to robić? To jeden z powodów. A właściwie 10 (i więcej). A oprócz tego dla przyjemności i rozwoju. Nauczenia się czegoś nowego w pracy zamiast po pracy, nadal będąc wydajnym pracownikiem. Ale… Do dzieła!
Jak ożenić F# i C#? Potrzeba nam 2 projektów jeden w F#, a drugi w C#. Teoretycznie istnieje możliwość mieszania języków w jednym projekcie, ale wymaga trochę ręcznego rzeźbienia i zabawy np. make (ręczne kompilowanie etc.). Ponieważ to tylko przykład (choć na produkcyjnym kodzie) powstrzymam się od kombinacji i zrobię to prosto. Posiadam już aplikację w C#, i to taką bardzo legacy, więc testy jako takie przyjmowane są z miłością. Stworzę więc nowy projekt w F#:
Po stworzeniu projektu dodam do niego referencje. Jedna do projektu, który zamierzam testować, a druga za pomocą Nuget do NUnit (3.0.1):
No to mamy czego potrzebujemy – czas na działanie. Do kodu!
1 2 3 4 5 6 7 8 |
namespace FSharpTest open Soneta.Printer module PrinterTests = let ShouldReturnProcessArguments() = let pa = PrinterProcessArguments(AspGenerator.Destinations.Printer, "tempfilename.txt", "") 2 |
- Na samej górze namespace. Ponieważ testuję, czy F# działa, stąd taka nazwa (normalnie byłoby Soneta.Printer.Test).
- Konstrukcje używające open to odpowiedniki using w C#. Trzeba otworzyć namespace lub moduł aby móc używać zawartych w nim klas czy elementów.
- Potem tworzymy nowy moduł który posiada 1 funkcję w której tworzymy nowy obiekt klasy PrinterProcessArguments. Niestety, czego nie widzicie, kompilator podkreśla tę linijkę.
- Na końcu jest 2, które na razie jest zwracane przez funkcję, aby kompilator nie robił dodatkowych problemów. Uwaga białe znaki mają znaczenie w F#, dlatego nie ma nawiasów – tabulator wydziela kod.
Ale co z tym błędem? Okazuje się, że kompilator ładnie podpowiada:
Super, kompilator powiadamia mnie, jakich referencji mi brakuje. Po dodaniu brakującej referencji wszystko działa jak należy. Czas uzupełnić kod o asercję:
1 2 3 4 5 6 7 8 9 10 |
namespace FSharpTest open Soneta.Printer open NUnit.Framework open System.Diagnostics module PrinterTests = let ShouldReturnProcessArguments() = let pa = PrinterProcessArguments(AspGenerator.Destinations.Printer, "tempfilename.txt", "") Assert.IsInstanceOf<ProcessStartInfo>(pa.GetProcessStartInfo()) |
Teraz mamy już asercję i wszystko co jest nam potrzebne aby wykonać test. Zrobimy to za pomocą R#, aby ładnie wyglądało, choć w babunie działa to szybciej 🙂
Dla porównania ten sam test w C#:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System.Diagnostics; using NUnit.Framework; namespace Soneta.Printer.Test { [TestFixture] public class PrinterProcessArgumentsTest { [Test] public void ShouldReturnProcessArguments() { var pa = new PrinterProcessArguments(AspGenerator.Destinations.Printer, "tempfilename.txt", ""); Assert.IsInstanceOf<ProcessStartInfo>(pa.GetProcessStartInfo()); } } } |
Prawda, że w F# ładniej i ciekawiej? Zdecydowanie fajniej się robi jak zaczyna się używać funkcji typu map itp. Dzięki takiemu podejściu możecie zgłębiać programowanie funkcyjne oraz nowe języki w swojej obecnej niekoniecznie w pełni funkcyjnej pracy. Wystarczy trochę chęci! A nuż, widelec, a może nawet talerz, spodoba się to wszystkim i zaczniecie próbować nowych rzeczy i sposobów na rozwiązywanie problemów za pomocą innych narzędzi niż w kółko C# i .NET. Do czego serdecznie zachęcam.
A po co Ci te paskudne średniki na końcu linii? 😛
No i wydało się – to choroba kopiego pasta z C# – przepraszam!
Mam pytanie, cóż to za ‘skórka’ VS? Jak zmienić tę podstawową kolorystykę?
Ta skórka to “Solarized Dark”. Jest też na jasne pory i jak świeci słońce “Solarized light”. Skórki znajdziesz w tym extension: https://visualstudiogallery.msdn.microsoft.com/6f4b51b6-5c6b-4a81-9cb5-f2daa560430b. P.S. Ten motyw jest dość mocno znany mam go i w Vimie oraz konsoli. Dzięki takiemu współgraniu i fajnym tonom nie mam “oczokwiku”.
Dziękuję serdecznie 🙂 Ja do tej pory szukałem skórek podobnych do ciemnej VS by mieć wszędzie te same. Muszę wypróbować tą bo chyba jest bardziej popularna.
Ach ach Soneta… 🙂
Ciekawy wpis. Spróbuję użyć tego przy MVC.
Zaiste, Solarized Dark to świetny motyw, używam także w NP++.
Znasz Sonetę? Tak, motyw jest świetny, choć kolega wczoraj mówił, że się szybko wyleczył i przeszedł na solarized light. Ja używam ich zamiennie w zależności od przyciemnienia w pokoju.
a można jescze ładniej: https://gist.github.com/anonymous/1d7bbe2d67428d5b33624abef08aa1a6
(pisałem bez głowy, ale powinno działać) dodaj tylko referencje do FsUnit’a
zamiast instanceOfType miało byc ProcessStartInfo
No ale to co podałeś to już wyższa szkoła jazdy – fajne dzięki! 🙂