• 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

0 głosów
51 wizyt
pytanie zadane 19 kwietnia 2020 w C# przez dawid2002 Mądrala (5,140 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,140 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ź 100 wizyt
0 głosów
0 odpowiedzi 112 wizyt
pytanie zadane 19 kwietnia 2020 w C# przez dawid2002 Mądrala (5,140 p.)
0 głosów
0 odpowiedzi 77 wizyt
pytanie zadane 20 marca 2020 w C# przez dawid2002 Mądrala (5,140 p.)

86,448 zapytań

135,207 odpowiedzi

300,348 komentarzy

57,196 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...