Moq weryfikacja z parametrem obiektu

86

Próbuję zweryfikować parametr, który jest klasą. Testowany kod jest w porządku. Błąd jest w teście.

Wypróbowałem dwie metody, z których obie zawiodły.

Oto moje próby:

1:

this.MockImageResizeFilter.Verify(m => m.Filter(this.UploadedFileData, new ImageFilterOptions()
    {
        Width = 256,
        Height = 256,
    }));

To zawsze kończy się niepowodzeniem, mimo że obiekt przekazany jako drugi parametr ma równe właściwości. Pierwszy parametr jest poprawnie zweryfikowany.

2:

this.MockImageResizeFilter.Setup(m => m.Filter(It.IsAny<byte[]>(), It.IsAny<ImageFilterOptions>()))
    .Callback<byte[], ImageFilterOptions>((data, options) =>
        {
            Assert.AreEqual(this.UploadedFileData, data, "data");
            Assert.AreEqual(filterOptions.Width, options.Width, "Width");
            Assert.AreEqual(filterOptions.Height, options.Height, "Height");
        }
    );

To zawsze mija, nawet jeśli się nie powiedzie. Potwierdzenia w wywołaniu zwrotnym kończą się niepowodzeniem, ale wyjątek nie jest przekazywany do kontekstu zewnętrznego, a zatem test zawsze kończy się pomyślnie.

Czy możesz mi pomóc znaleźć to, co robię źle?

rhughes
źródło

Odpowiedzi:

138

Pierwsza próba jest bliżej tego, co chcesz osiągnąć.

Powodem niepowodzenia jest to, że Moq (prawdopodobnie) używa Object.Equalspod osłoną do sprawdzenia, czy ImageFilterOptionsparametr, z którym wywołano metodę, jest tym samym wystąpieniem, co ten, który podałeś w wywołaniu Verify.

Niemożliwe jest, aby były one tą samą instancją, ponieważ w Verifytobie tworzysz plik new ImageFilterOptions().

Zamiast wykonywać sprawdzanie parametrów w ten sposób, można użyć It.Isskładni Moq, aby podać wyrażenie, które sprawdza, czy parametr był oczekiwany.

W twoim przypadku, chcesz sprawdzić, że parametr jest typu ImageFilterOptionsi że zarówno Widthi Heightsą ustawione 256. Wyrażenie, które na to pozwala:

It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256)

Twoje wezwanie Verifymoże więc wyglądać tak:

this.MockImageResizeFilter.Verify(m => m.Filter(
            this.UploadedFileData,
            It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256)));
Cristian Lupascu
źródło
1
Składnia, że miałem do wykorzystania będzie: It.Is((ImageFilterOptions p) => p.Width == 256 && p.Height == 256). Nie było generycznegoIs
Stanislav
1
Wersja ogólna działa dla mnie i znajduje się w dokumentacji API nudoq.org/#!/Packages/Moq/Moq/It/M/Is(TValue) - czy używasz nieaktualnej wersji Moq?
Tim Abell