इसलिए मैं अपने एमवीसी 4 एप्लिकेशन के लिए परीक्षण लिख रहा हूं और मैं विशेष रूप से नियंत्रक क्रियाओं का परीक्षण कर रहा हूं। जैसा कि मैंने शीर्षक में उल्लेख किया है, टेस्ट डेटा लौटने के बजाय परीक्षण अभी भी सेवा (डब्ल्यूसीएफ) को हिट करता है। मैं इस नियंत्रक है:मॉक ऑब्जेक्ट अभी भी सेवा करने के लिए कॉल कर रहा है
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);
}
और यह इस डीएओ वस्तु का उपयोग करता है:
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;
}
और यह अपने परीक्षण JustMock, GetForms पर नकली() एक सहायक कक्षा में कुछ परीक्षण डाटा रिटर्न उपयोग कर रहा है:
[TestClass]
public class FormControllerTest
{
private SurveyDao mockDao;
private SurveyServiceClient mockClient;
public FormControllerTest()
{
mockClient = Mock.Create<SurveyServiceClient>();
mockDao = Mock.Create<SurveyDao>(mockClient);
}
[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));
}
}
मेरी समस्या यह है कि जब मैं परीक्षण चलाता हूं, तो सेवा अभी भी कॉल की जा रही है। मैंने इसे फिडलर का उपयोग करके सत्यापित किया है और परीक्षण को डीबग करने और "परिणाम" के मूल्य का निरीक्षण करने की पुष्टि की है जो हमारी सेवा के परीक्षण डेटा के साथ आबादी है।
संपादित करें:
मैं परीक्षण निर्माता एक [TestInitialize] समारोह होने के लिए बदल दिया है, तो टेस्ट अब इस तरह दिखता है:
[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));
}
}
GetForms वर्चुअल विधि नहीं होना चाहिए? – rla4
@ rla4, आप ऐसा क्यों कहते हैं? मॉक किए गए तरीकों को वर्चुअल होने की आवश्यकता है? – mam8cc
यह निर्भर करता है। मैं जस्टमैक से परिचित नहीं हूं, लेकिन कई मॉकिंग फ्रेमवर्क डायनेमिक्स प्रॉक्सीइंग पर भरोसा करते हैं, जिन्हें वर्चुअल विधियों की आवश्यकता हो सकती है :) – rla4