Jak sprawdzić, czy metoda została wywołana dokładnie raz za pomocą Moq? Sprawa Verify()
vs. Verifable()
jest naprawdę zagmatwana.
112
Możesz użyć Times.Once()
lub Times.Exactly(1)
:
mockContext.Verify(x => x.SaveChanges(), Times.Once());
mockContext.Verify(x => x.SaveChanges(), Times.Exactly(1));
Oto metody w klasie Times :
AtLeast
- Określa, że symulowana metoda powinna być wywoływana razy minimum.AtLeastOnce
- określa, że symulowana metoda powinna być wywoływana co najmniej jeden raz.AtMost
- Określa, że symulowana metoda powinna być wywoływana w maksymalnych odstępach czasu.AtMostOnce
- określa, że symulowana metoda powinna być wywoływana maksymalnie jeden raz.Between
- określa, że mockowana metoda powinna być wywoływana między czasami.Exactly
- określa, że symulowana metoda powinna być wywoływana dokładnie razy.Never
- określa, że nie należy wywoływać fałszywej metody.Once
- określa, że symulowana metoda powinna być wywoływana dokładnie jeden raz.Pamiętaj tylko, że są to wywołania metod; Ciągle się potykałem, myśląc, że to właściwości i zapominając o nawiasach.
var mockContext = new Mock<IContext>()
ustawienia tego.AtLeast
,AtMost
,Between
, lubExactly
mogą być postrzegane jako własność. Chodzi mi o to, że potrzebują parametru, aby coś zrobić.Wyobraź sobie, że tworzymy kalkulator z jedną metodą dodawania 2 liczb całkowitych. Wyobraźmy sobie dalej, że wymaganie polega na tym, że wywołanie metody add powoduje jednokrotne wywołanie metody print. Oto jak byśmy to przetestowali:
A oto rzeczywisty test z komentarzami w kodzie w celu dalszego wyjaśnienia:
Uwaga : Domyślnie Moq usunie wszystkie właściwości i metody, gdy tylko utworzysz obiekt Mock. Więc nawet bez wywoływania
Setup
, Moq już zdeponował metody,IPrinter
więc możesz po prostu wywołaćVerify
. Jednak jako dobrą praktykę zawsze ją konfiguruję, ponieważ może być konieczne wymuszenie parametrów metody, aby spełnić określone oczekiwania, lub wartość zwracaną z metody w celu spełnienia określonych oczekiwań lub liczbę jej wywołań.źródło
Verify
,Times.Once
nigdy nie dzwoniłemSetup
. Z pewnością spodziewałbymVerify
się wybuchu w takim przypadku, ale tak się nie stało.Mock
obiekt. Więc nawet bez wywoływaniaSetup
, Moq już zdeponował metody,IPrinter
więc możesz po prostu wywołaćVerify
. Jednak w ramach dobrej praktyki zawsze ją konfiguruję, ponieważ może być konieczne wymuszenie parametrów metody lub wartości zwracanej z metody.Times.Exactly(1)
i nie zawiodło się, gdy metoda została faktycznie wywołana dwukrotnie. Dopiero po dodaniuSetup
dla danej metody nie udało się to poprawnie.Kontrolerem testu może być:
A gdy metoda DeleteCars zostanie wywołana z poprawnym identyfikatorem, możemy to sprawdzić, metoda Service remove została wywołana dokładnie raz przez ten test:
źródło