2012-11-21 11 views
42

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

Próbowałem dwóch metod, z których oba nie powiodło się.

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 jednakowe właściwości. Pierwszy parametr został zweryfikowany poprawnie.

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 przechodzi, nawet wtedy, gdy powinna ona niepowodzeniem. Asserts w wywołaniu zwrotnym nie działają, ale wyjątek nie jest przekazywany do zewnętrznego kontekstu, a zatem test zawsze przechodzi.

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

Odpowiedz

66

Pierwsza próba jest bliższa temu, co chcesz osiągnąć.

Powodem jest to, że nie jest on Moq (prawdopodobnie) wykorzystuje Object.Equals pod pokrywą aby sprawdzić, czy parametr ImageFilterOptions że metoda została wywołana jest taki sam przypadek jak ten, który dostarczył na wezwanie do Verify.

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

Zamiast wykonywania sprawdzania parametrów w ten sposób, można użyć składni Moq It.Is, aby podać wyrażenie, które weryfikuje oczekiwany parametr.

W twoim przypadku, chcesz sprawdzić, że parametr jest typu ImageFilterOptions i że zarówno Width i Height są ustawione na 256. Wyrażenie, które pozwala na to jest:

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

Tak, połączenie do Verify mógłby wyglądać następująco:

this.MockImageResizeFilter.Verify(m => m.Filter(
      this.UploadedFileData, 
      It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256))); 
+0

na miejscu, dzięki! – rhughes

+1

Składnia, której musiałem użyć, to: 'It.Is ((ImageFilterOptions p) => p.Width == 256 && p.Height == 256)'. Nie było generycznego 'Is' – Nemo1024

+0

Ogólna wersja działa dla mnie i jest w dokumentach API http://www.nudoq.org/#!/Packages/Moq/Moq/It/M/Is(TValue) - czy jesteś używając przestarzałej wersji Moq? –

Powiązane problemy