• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C# - IConsole nie można wykryć typu oraz testowanie metod z ReadKey za pomocą mocków

VPS Starter Arubacloud
0 głosów
217 wizyt
pytanie zadane 19 kwietnia 2020 w C# przez dawid2002 Mądrala (5,190 p.)
edycja 19 kwietnia 2020 przez dawid2002
Witam! Chciałem przetestować metodę, która wewnątrz używa Console.ReadKey. Nie jestem pewien, ale najlepiej jest to zrobić za pomocą mocków. W internecie znalazłem takie rozwiązanie:

https://stackoverflow.com/questions/55762713/how-to-mock-a-keypress-in-test-method

Napisałem podobny kod do tego jaki jest na tamtej stronie i kiedy chciałem stworzyć atrapę konsoli (Mock<IConsole>) to pojawił się błąd, że nie można znaleźć nazwy "IConsole".

Jak naprawić ten błąd? Albo jak zrobić, żeby dało się przetestować metodę, która oczekuje na naciśniecie klawisza?

Z góry dziękuje za pomoc!!!

1 odpowiedź

0 głosów
odpowiedź 19 kwietnia 2020 przez Siemił Mądrala (7,380 p.)
wybrane 19 kwietnia 2020 przez dawid2002
 
Najlepsza
Stworz interfejs IConsole ktory bedzie mial metode ReadKey. Potem stworz klase ktora implementuje metode IConsole a metode Console.ReadKey uzyj w metodzie ReadKey. Potem wstrzyknik do swojej klasy/metody obiekt typu IConsole. Przy okazji poczytaj o wstrzykiwaniu zaleznosci. Jak czegos nie rozumiesz to pisz.
komentarz 19 kwietnia 2020 przez dawid2002 Mądrala (5,190 p.)

Kod, który teraz napisałem działa, ale nie wiem czy jest "czysty" (nie licząc nazw, które pisałem na szybko).

Kod do testowania:

using System;

namespace MyProject
{
    public interface IConsole
    {
        ConsoleKeyInfo ReadKey();
    }

    public class FakeConsole : IConsole
    {
        public ConsoleKeyInfo ReadKey()
        {
            return Console.ReadKey();
        }
    }

    public class ClassToTest
    {
        private IConsole MyConsole;

        public ClassToTest(IConsole console)
        {
            MyConsole = console;
        }

        public bool DidUserPressZeroKey()
        {
            return MyConsole.ReadKey().Key == ConsoleKey.D0;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            
        }
    }
}

Test:

using NUnit.Framework;
using Moq;
using System;

namespace Tests
{
    [TestFixture]
    public class Tests
    {
        [Test]
        public void Test1()
        {
            var Mock1 = new Mock<MyProject.IConsole>();
            var ConsoleInfo = new ConsoleKeyInfo('0', ConsoleKey.D0, false, false, false);
            Mock1.Setup(m => m.ReadKey()).Returns(ConsoleInfo);
            var Class = new MyProject.ClassToTest(Mock1.Object);

            bool Result = Class.DidUserPressZeroKey();

            Assert.IsTrue(Result);
        }
    }
}

 

komentarz 19 kwietnia 2020 przez Siemił Mądrala (7,380 p.)
O to wlasnie mi chodzilo. Moim zdaniem jest poprawnie.

Podobne pytania

+1 głos
1 odpowiedź 185 wizyt
0 głosów
0 odpowiedzi 406 wizyt
pytanie zadane 19 kwietnia 2020 w C# przez dawid2002 Mądrala (5,190 p.)
0 głosów
0 odpowiedzi 148 wizyt
pytanie zadane 20 marca 2020 w C# przez dawid2002 Mądrala (5,190 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...