Ich versuche, die Index
Aktion eines Controllers zu testen. Die Aktion verwendet AutoMapper, um ein Objekt der Domäne Customer
einem Ansichtsmodell TestCustomerForm
zuzuordnen. Während dies funktioniert, bin ich besorgt über den besten Weg, um die Ergebnisse zu testen, die ich von der Index
Aktion erhalten.Nach der Verwendung von Automapper, um ein ViewModel zuzuordnen, wie und was soll ich testen?
Die Index Aktion sieht der Steuerung wie folgt aus:
public ActionResult Index()
{
TestCustomerForm cust = Mapper.Map<Customer,
TestCustomerForm>(_repository.GetCustomerByLogin(CurrentUserLoginName));
return View(cust);
}
Und seine TestMethod
sieht wie folgt aus:
[TestMethod]
public void IndexShouldReturnCustomerWithMachines()
{
// arrange
var customer = SetupCustomerForRepository(); // gets a boiler plate customer
var testController = CreateTestController();
// act
ViewResult result = testController.Index() as ViewResult;
// assert
Assert.AreEqual(customer.MachineList.Count(),
(result.ViewData.Model as TestCustomerForm).MachineList.Count());
}
Im CreateTestController
Methode, die ich Rhino.Mocks
verwenden, um einen Kunden-Repository zu verspotten und es bis zu den Kunden von SetupCustomerForRepository
zurückgeben. Auf diese Weise weiß ich, dass das Repository den beabsichtigten Kunden zurückgibt, wenn die Index
Aktion _repository.GetCustomerByLogin(CurrentUserLoginName)
aufruft. Daher halte ich es für ausreichend,zu bestätigen.
All dies sagte, ich bin besorgt, was ich testen sollte.
- Es scheint vermessen zu sein, die
result.ViewData.Model as TestCustomerForm
zu werfen. Ist das wirklich ein Problem? Dies betrifft mich, weil ich in diesem Fall keine wirklich testgetriebene Entwicklung betreibe und es scheint, als würde ich auf eine bestimmte Implementierung zählen, um den Test zu bestehen. - Gibt es geeignetere Tests, um eine korrekte Zuordnung zu gewährleisten?
- Sollte ich jede gemappte Eigenschaft von der
TestCustomerForm
testen? - Gibt es allgemeinere Controller-Action-Tests, die ich tun sollte?
public interface IMapper<TSource, TDest> { TDest Map(TSource source); } public CustomerToTestCustomerFormMapper: IMapper<Customer, TestCustomerForm> { static CustomerToTestCustomerFormMapper() { // TODO: Configure the mapping rules here } public TestCustomerForm Map(Customer source) { return Mapper.Map<Customer, TestCustomerForm>(source); } }
Weiter Sie diese passieren in die Steuerung:
Große Antwort, die viel Sinn macht. Für die Nachwelt würde es Ihnen etwas ausmachen, Ihre Testaussage hinzuzufügen? – ahsteele
Wie würde das mit dem neuen WebApi funktionieren, bei dem meine Get-Methode ein IEnumerable zurückgibt und kein Aktionsergebnis? –
shashi
@sassyboy Ich neige dazu, eine isolierte Service-Schicht mit Web-API zu verwenden, wo Sie eine ähnliche Abstraktion erstellen könnten. –