GON*_*ale 5 .net unit-testing dependency-injection moq mocking
我是Mocking的新手,对单元测试有些熟悉,最后决定用一个严格的TDD方法开始一个新项目.但是,我有一个服务类和方法,我需要回顾性地添加测试,因为它已从原型升级.
我不知道在这个特定的测试中从哪里开始,这是涉及的类和方法:
public class PageService : IPageService
{
private readonly ITestService testServiceClient;
public PageService(ITestService testServiceClient)
{
this.testServiceClient = testServiceClient;
}
public Page GetPage(Guid websiteId, string pageKey)
{
Page builtPage = null;
// WCF SERVICE CALL I DO NOT WANT EXECUTING WHEN RUNNING UNIT TEST
// BUT RATHER WANT A BLANK NEW INSTANCE OF "PAGE" CREATED USING MOQ??
var page = testServiceClient.GetPage(websiteId, pageKey);
if (page == null)
return null;
builtPage = new Page();
[code here to build builtPage if input params ok] ...
return builtPage;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在努力做的是写一个测试,希望我可以扩展GetPage(...)测试的所有排列,但是对于第一个测试是否有效websiteId并且pageKey已经传入,如果是这样接收有效的Page实例并且断言为真到单元测试.
testServiceClient是一个WCF服务客户端,它之前已经包含在一个using()语句中,但是我已经将它移出了它,希望能够依赖注入,因为我觉得这将是测试所需的第一步,据我了解,我需要假装/嘲笑?wcf客户端而不是testServiceClient.GetPage()返回已知的内存数据集?希望我在那里走在正确的轨道上.
所以这是我的单元测试的初始蓝图(我正在使用Moq框架,如果您没有使用Moq Setup()的最新版本,Expect()则是新版本):
/// <summary>
/// Tests service returns a valid instance of type `Page` when a valid website and valid page key is tested.
/// </summary>
[TestMethod]
public void Test_Valid_Website_And_Valid_PageKey_Returns_Valid_Instance_Of_Page()
{
// Arrange
Page page = null;
// Act
var newPage = new Page() { Title = "Mocked Version!?"};
testServiceClient = new Mock<ITestService>();
testServiceClient.Setup(x => x.GetPage(websiteId, "about-us")).Returns(newPage);
service = new PageService(testServiceClient.Object);
page = service.GetPage(websiteId, "about-us");
// Assert
Assert.IsInstanceOfType(page, typeof(Page), "Object was not of expected instance type.");
}
Run Code Online (Sandbox Code Playgroud)
我不知道从哪里开始,或者我是否在正确的轨道上?我可以确认上面没有语法错误,我确实收到一个异常:
System.ArgumentException: Invalid setup on a non-overridable member:
x => x.GetPage(websiteId, "about-us").
Run Code Online (Sandbox Code Playgroud)
我所知道的是,我希望我service.GetPage(...)返回一个新实例,因为websiteId它pageKey是有效的,但我不希望它使用真正的testServiceClient.GetPage()WCF调用...希望我理解正确模拟的想法.当你使用testServiceClient.GetPage该服务时,我是否通过Moq正确地告诉了它,实际上只返回一个新的页面实例?
非常感谢任何澄清!多谢你们!
我想说你走在正确的道路上。如果 ITestService 确实是一个接口(如其名称所示),您将能够模拟它。
但是,当您定义设置时,Moq 必须能够识别您所指的方法,并且似乎您以某种方式指示了接口上不存在的方法。
您没有向我们展示 ITestService 接口,我们也不知道变量的类型websiteId。
如果您仔细查看 Setup 方法,您会发现它实际上是一个泛型方法,因此当您在没有泛型参数的情况下调用它时,会进行类型推断。
我的猜测是, 的声明websiteId与 GetPage 的声明发生了冲突。例如,如果websiteId被声明为object,Moq 将处理具有以下签名的方法:
Page GetPage(object x, string y);
Run Code Online (Sandbox Code Playgroud)
这不等于
Page GetPage(Guid x, string y);
Run Code Online (Sandbox Code Playgroud)
无论如何,一旦您设法使安装程序正常工作,您关于单元测试的基本想法似乎就很好了。您可以做的不仅仅是断言实例不为 null,因为 Mock 将确保返回的实例与您最初设置的实例相同:
[TestMethod]
public void Test_Valid_Website_And_Valid_PageKey_Returns_Valid_Instance_Of_Page()
{
// Arrange
Page page = null;
// Act
var newPage = new Page() { Title = "Mocked Version!?"};
testServiceClient = new Mock<ITestService>();
testServiceClient.Setup(x => x.GetPage(websiteId, "about-us")).Returns(newPage);
service = new PageService(testServiceClient.Object);
page = service.GetPage(websiteId, "about-us");
// Assert
Assert.AreEqual(newPage, page);
}
Run Code Online (Sandbox Code Playgroud)
请注意更有价值的断言。
| 归档时间: |
|
| 查看次数: |
2162 次 |
| 最近记录: |