2010-10-27 2 views
14

Mam następujące klasy:Moq: Ustaw właściwość bez ustawiacza?

public class PairOfDice 
{ 
    private Dice d1,d2; 
    public int Value 
    { 
     get { return d1.Value + d2.Value; } 
    } 
} 

Teraz chciałbym użyć PairOfDice w moim teście, która zwraca wartość 1, chociaż używam wartości losowych w moich prawdziwych kości:

[Test] 
public void DoOneStep() 
{ 
    var mock = new Mock<PairOfDice>(); 
    mock.Setup(x => x.Value).Return(2); 
    PairOfDice d = mock.Object; 
    Assert.AreEqual(1, d.Value); 
} 

Niestety uzyskać błąd Invalid setup on non-overridable member. Co mogę zrobić w tej sytuacji?

Proszę zauważyć, że jest to moja pierwsza próba wdrożenia testów jednostkowych.

Odpowiedz

12

Twój problem polega na tym, że nie jest to virtual. Nie dlatego, że nie masz setera.

Moq nie może utworzyć proxy, ponieważ nie może przesłonić twojej własności. Musisz użyć interfejsu, metody wirtualnej lub metody abstrakcyjnej.

+0

Czy jest wada ustawienie tej właściwości na wirtualną? – Sven

+2

Tylko jeśli uważasz podklasy za "nadpisanie", to funkcja jest zagrożeniem. Zasadniczo nic wartego uwagi, chyba że jest to super bezpieczna funkcja, której nie można ufać innym klasom, aby uzyskać prawo, jednak ci, którzy i tak nie powinni być kpiną, ponieważ nie byliby publiczni. – Aren

+2

Ta odpowiedź jest już nieaktualna, ponieważ Moq może udawać właściwości inne niż wirtualne. – krillgar

36

Możesz użyć .SetupGet na swoim symulowanym obiekcie.

np.

[Test] 
public void DoOneStep() 
{ 
    var mock = new Mock<PairOfDice>(); 
    mock.SetupGet(x => x.Value).Returns(1); 
    PairOfDice d = mock.Object; 
    Assert.AreEqual(1, d.Value); 
} 

Zobacz here dla dalszych szczegółów.

+2

Nadal ma dokładnie ten sam problem, jak wspomniano powyżej problem polega na tym, że nie jest wirtualny. –

+3

SetupGet jest prawidłową metodą, niezależnie od poprawnej odpowiedzi. Tworzenie wirtualnego pola, które NIGDY nie zostanie zastąpione lub nie ma potrzeby, jest proste i może naruszać to, co programista chce zabezpieczyć. Jest to prosty problem i sprawienie, że pole wirtualne prawdopodobnie nie ma większego wpływu, ale w realnym świecie, zrobienie czegoś wirtualnego tylko po to, by przetestować to jest niepoprawne, dlatego możesz wykpić wartość używając SetupGet. – iGanja

+0

@ Jim, twój link idzie teraz do 404, czy jest jakiś sposób, aby go zaktualizować? +1 z tego samego powodu, o którym wspomina iGanja. –