Jak poprawnie Mock'cować Extension methods?

1

Znalazłem kilka sposób na Mockwowanie Extension Methods. Wrappery, delegaty albo te całe "Moles". Czego używanie, który sposób jest najprostszy w implementacji?

0

Jeżeli extension jest na interface to nie będzie problemów z mockowaniem. Poza ifaceami jeżeli extension jest na ValueType'ie to też prosto, wystarczy utworzyć instancje ValueType'a i sprawdzić czy metoda działa.

Jeżeli dodajesz extensiony do klasy tak że ciężko to przetestować to może (ale nie musi) to oznaczać że robisz coś krzywo. Wrzuć konkretny kod to będzie można powiedzieć więcej.

6

ale po co? odwołujesz się w nich do bazy danych czy coś? nie trzeba mockować wszystkiego co się rusza. pokaż konkretny kod

1

Poprawnie się nie da, ale na szczęście rzadko potrzeba.
Jeśli masz do czynienia z patoblioteką, która nie wystawia normalnego API a jedynie extensiony (jak np. Hangfire), to chyba musisz poczytać ich kod, aby ogarnąć, co tam się pod spodem dzieje, i co faktycznie jest wywoływane i tamto zamockować.

To wszystko o ile faktycznie potrzebujesz mockowania.

0

@0xmarcin: @obscurity:
Na przyklad cos takiego

public interface ISomeInterface
    {
    }

    public static class Extensions
    {
        public static int ExtensionMethod(this ISomeInterface someInterface)
        {
            return 1;
        }
    }

    public class MyClass
    {
        public MyClass(ISomeInterface someInterface)
        {
            _interface = someInterface;
        }

        public void SomeMethod()
        {
            _interface.ExtensionMethod();
        }

        private readonly ISomeInterface _interface;
    }

I teraz test:

[TestMethod]
public void TestExtensionMethod()
    {
        var SomeInterfaceMock = new Mock<ISomeInterface>();
        SomeInterfaceMock.Setup(p => p.ExtensionMethod()).Return(1); // <- Nie moge ustawic Setup!

        // dalszy kod ...
    }
1

No rozumiem co chcesz zrobić, ale pokaż prawdziwy kod PO CO chcesz to zrobić
Co ci przeszkadza ta wartość 1? Czemu w testach miałoby to zwracać coś innego? Testy powinny przejść przez tyle prawdziwego kodu ile to tylko możliwe, jeśli zamockujesz wszystko wokół klasy którą testujesz to testujesz wydmuszkę która pewnie nie robi nic więcej niż jej każesz w teście. Jasne wywoła fejkową metodę z mocka który jej dałeś, bo czemu miałaby tego nie zrobić. Jaka jest wartość takiego testu?

Extension methods to zwykłe metody statyczne z cukrem składniowym. Jeśli chcesz mockować extension methods to potraktuj je jak zwykłe metody statyczne i szukaj

3

@Fibonacci: nie możesz ustawić w setup, bo to jest metoda statyczna. Mockowanie to nie jest magia, to działa poprzez tworzenie w locie obiektu tymczasowej klasy implementującej dany interfejs (albo dziedziczeniu z klasy i nadpisywaniu jej metod, jeśli mockujemy klasę). Ponieważ extension nie istnieje w interfejsie tylko w statycznej klasie, to nie ma mowy o żadnej implementacji w locie, tworzeniu proxy, czy nadpisywaniu metod.

Extensiony to metody statyczne, więc po prostu nie powinno się ich używać tam, gdzie może zachodzić potrzeba mockowania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1