Смежный объект все еще звонит в сервис
Поэтому я пишу тесты для нашего приложения MVC4 и специально тестирую действия контроллера. Как я упоминаю в заголовке, тест все равно попадает в сервис (WCF), а не возвращает тестовые данные. У меня есть этот контроллер:
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);
}
И он использует этот объект DAO:
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));
}
}
Моя проблема в том, что когда я запускаю тест, служба все еще вызывается. Я проверил это с помощью Fiddler, а также отладки теста и проверки значения "result", которое заполняется тестовыми данными нашего сервиса.
РЕДАКТИРОВАТЬ:
Я изменил конструктор теста на функцию [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));
}
}
2 ответа
Пожалуйста, убедитесь, что вы используете правильную сборку для JustMock. Есть несколько разных (VisualBasic, Silverlight, JustMock). JustMock - это тот, который вы должны включить в свой проект.
Неверное включение правильного приведет к описываемому вами поведению (метод не был правильно задан).
Руководство JustMock объясняет (основные моменты мной):
По умолчанию Telerik JustMock использует свободные макеты и позволяет вам вызывать любой метод данного типа. Независимо от того, организован вызов метода или нет, вы можете вызвать его.
Вы можете контролировать это поведение при вызове Create()
метод вас издеваться
var foo = Mock.Create<IFoo>(Behavior.Strict);
Там вы можете указать, что должен делать фиктивный объект, если вы явно не реализовали определенный метод. В вашем случае (я думаю, что это поведение по умолчанию) макет действительно вызывает оригинальный метод объекта, который вы хотите имитировать.
У вас есть следующие варианты в Behavior Enumeration
перечисление:
- Loose: указывает, что по умолчанию фиктивные вызовы будут вести себя как заглушка, если явно не настроены.
- RecursiveLoose. Указывает, что по умолчанию фиктивные вызовы будут возвращать фиктивные объекты, если они не установлены явно.
- Строгое. Указывает, что любые вызовы, сделанные на макете, будут вызывать исключение, если не указано иное.
- CallOriginal: указывает, что по умолчанию все вызовы, сделанные в mock, будут вызывать соответствующий исходный элемент, если не установлены некоторые исключения.