模拟对象仍在调用服务
本文关键字:调用 服务 对象 模拟 | 更新日期: 2023-09-27 18:35:21
所以我正在为我们的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 验证了这一点,并调试了测试并检查了填充了我们服务的测试数据的"结果"的值。
编辑:
我已将测试构造函数更改为 [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));
}
}
请验证您是否为 JustMock 使用了正确的程序集。 有几个不同的(VisualBasic,Silverlight,JustMock)。 JustMock 是您应该包含在项目中的那个。
未能包含正确的方法将导致您描述的行为(方法未正确存根)。
JustMock手册解释(我的亮点):
默认情况下,Telerik JustMock使用松散的模拟并允许您调用 给定类型的任何方法。无论方法调用是否 安排与否,你都可以打电话。
调用 Mock 的 Create()
方法时,可以控制此行为:
var foo = Mock.Create<IFoo>(Behavior.Strict);
在那里,您可以指定 mock 对象在未显式实现某个方法时应执行的操作。在您的情况下(我认为这是默认行为),模拟确实在您想要模拟的对象上调用原始方法。
在Behavior Enumeration
枚举中,您有以下选择:
- 松散:指定默认情况下模拟调用的行为类似于存根,除非显式设置。
- 递归松散:指定默认情况下模拟调用将返回模拟对象,除非显式设置。
- 严格:指定如果未显式设置,则对模拟进行的任何调用都将引发异常。
- CallOriginal:指定默认情况下,在 mock 上进行的所有调用都将调用其相应的原始成员,除非设置了一些 expation。