Also schreibe ich Tests für unsere MVC4-Anwendung und ich testen Controller-Aktionen speziell. Wie ich im Titel erwähne, trifft der Test immer noch den Dienst (WCF), anstatt Testdaten zurückzugeben. Ich habe diesen Controller:Gespiegelte Objekt immer noch Anrufe an Service
public class FormController : Controller
{
public SurveyServiceClient Service { get; set; }
public SurveyDao Dao { get; set; }
public FormController(SurveyServiceClient service = null, SurveyDao dao = null)
{
this.Service = service ?? new SurveyServiceClient();
this.Dao = dao ?? new SurveyDao(Service);
}
//
// GET: /Form/
public ActionResult Index()
{
var formsList = new List<FormDataTransformContainer>();
Dao.GetForms().ForEach(form => formsList.Add(form.ToContainer()));
var model = new IndexViewModel(){forms = formsList};
return View("Index", model);
}
Und es nutzt dieses DAO-Objekt:
public class SurveyDao
{
private readonly SurveyServiceClient _service;
private readonly string _authKey;
public SurveyDao(SurveyServiceClient serviceClient)
{
_service = serviceClient;
}
....
public FormContract[] GetForms()
{
var forms = _service.RetrieveAllForms();
return forms;
}
Und das ist mein Test mit JustMock, das Mock auf GetForms() gibt einige Testdaten in einer Hilfsklasse:
Mein Problem ist, dass der Dienst immer noch aufgerufen wird, wenn ich den Test ausführe. Ich habe dies mit Fiddler verifiziert und debugge den Test und prüfe den Wert von "result", der mit den Testdaten unseres Dienstes gefüllt ist.
EDIT:
ich den Test-Konstruktor geändert haben eine [TestInitialize] Funktion zu sein, so dass nun der Test wie folgt aussieht:
[TestClass]
public class FormControllerTest
{
private SurveyDao mockDao;
private SurveyServiceClient mockClient;
[TestInitialize]
public void Initialize()
{
mockClient = Mock.Create<SurveyServiceClient>();
mockDao = Mock.Create<SurveyDao>(Behavior.Strict);
}
[TestMethod]
public void TestIndexAction()
{
//Arrange
var controller = new FormController(mockClient, mockDao);
Mock.Arrange(() => mockDao.GetForms()).Returns(TestHelpers.FormContractArrayHelper);
//Act
var result = controller.Index() as ViewResult;
//Assert
Assert.IsInstanceOfType(result.Model, typeof(IndexViewModel));
}
}
Sollten GetForms keine virtuelle Methode sein? – rla4
@ rla4, warum sagst du das? Müssen gespottete Methoden virtuell sein? – mam8cc
Es kommt darauf an. Ich bin mit JustMock nicht vertraut, aber viele spöttische Frameworks verlassen sich auf Dynamix-Proxying, was virtuelle Methoden erfordern könnte :) – rla4