Mam klasę TimeMachine
, która podaje mi bieżące wartości daty/czasu. Klasa wygląda następująco:Stub jedna metoda klasy i niech inne rzeczywiste metody używają tego zglikowanego
public class TimeMachine
{
public virtual DateTime GetCurrentDateTime(){ return DateTime.Now; };
public virtual DateTime GetCurrentDate(){ return GetCurrentDateTime().Date; };
public virtual TimeSpan GetCurrentTime(){ return GetCurrentDateTime().TimeOfDay; };
}
Chciałbym użyć TimeMachine
niedopałek w moich testach w taki sposób, że ja po prostu odgałęzienie metodę GetCurrentDateTime
i niech inni 2 metody użyć zgaszone GetCurrentDateTime
metody tak jak ja nie trzeba odcinać wszystkich trzech metod. Próbowałem napisać test tak:
var time = MockRepository.GenerateStub<TimeMachine>();
time.Stub(x => x.GetCurrentDateTime())
.Return(new DateTime(2009, 11, 25, 12, 0, 0));
Assert.AreEqual(new DateTime(2009, 11, 25), time.GetCurrentDate());
Ale test kończy się niepowodzeniem. GetCurrentDate
zwraca default(DateTime)
zamiast wewnętrznego połączenia z kodem GetCurrentDateTime
.
Czy istnieje jakieś podejście, które mógłbym zastosować, aby osiągnąć takie zachowanie, czy jest to tylko kilka podstawowych cech koncepcyjnych RhinoMocks, których obecnie nie łapię? Wiem, że mogłem po prostu pozbyć się tych dwóch metod i wstawić użycie, ale chciałbym się dowiedzieć, czy to w ogóle możliwe.
Może to sprawić, że test przejdzie pomyślnie, ale metody powinny być wirtualne tylko wtedy, gdy klasa ma działać jako klasa podstawowa, a metoda jest specjalnie zaprojektowana, aby była nadpisana. Nie powinno to być wirtualne, tylko ze względu na testy jednostkowe. –
Dlaczego nie? Dlaczego nie uczynić wszystkich metod wirtualnymi ze względu na rozszerzalność? :) I chociaż akceptuję twoje argumenty, GateCurrentDateTime jest imo całkowicie OK, aby zostać zastąpione. – Buthrakaur
Zgadzam się. Dlaczego nie? Cóż prawie się zgadzam. W Javie każda metoda jest wirtualna. Ale wtedy nie dano ci czasu na kompilację, że nadpisałeś właściwą metodę. To znaczy, dopóki adnotacje nie zapiszą dnia. Ale .Net nie potrzebuje adnotacji, ponieważ zmusza do zadeklarowania metody jako wirtualnej i metody nadpisującej jako nadpisania. Ale byłoby miło, gdyby było lepsze rozwiązanie tego problemu. – uriDium