Wai*_*ein 3 c# asp.net-mvc unit-testing moq url-helper
我正在开发一个 Asp.net mvc Web 应用程序。我正在对我的应用程序进行单元测试。我正在使用 Moq 来模拟对象。我正在尝试模拟 Url 辅助类。我找到了这个链接 - asp.net mvc: how to mock Url.Content("~")? 。使用该类,我可以UrlHelper在单元测试中模拟类。
我创建了一个BaseController像这样的
public class BaseController : Controller
{
private IUrlHelper _urlHelper;
public new IUrlHelper Url
{
get { return _urlHelper; }
set { _urlHelper = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
这是IUrlHelper接口/抽象
public interface IUrlHelper
{
string Action(string actionName);
string Action(string actionName, object routeValues);
string Action(string actionName, string controllerName);
string Action(string actionName, RouteValueDictionary routeValues);
string Action(string actionName, string controllerName, object routeValues);
string Action(string actionName, string controllerName, RouteValueDictionary routeValues);
string Action(string actionName, string controllerName, object routeValues, string protocol);
string Action(string actionName, string controllerName, RouteValueDictionary routeValues, string protocol, string hostName);
string Content(string contentPath);
string Encode(string url);
string RouteUrl(object routeValues);
string RouteUrl(string routeName);
string RouteUrl(RouteValueDictionary routeValues);
string RouteUrl(string routeName, object routeValues);
string RouteUrl(string routeName, RouteValueDictionary routeValues);
string RouteUrl(string routeName, object routeValues, string protocol);
string RouteUrl(string routeName, RouteValueDictionary routeValues, string protocol, string hostName);
}
Run Code Online (Sandbox Code Playgroud)
Url.Content()我像这样在单元测试中模拟
Mock<IUrlHelper> urlHelperMock = new Mock<IUrlHelper>();
urlHelperMock
.Setup(x => x.Content(It.IsAny<string>()))
.Returns<string>(x => "~/" + x);// Mock Content method of Url Helper
Run Code Online (Sandbox Code Playgroud)
试运行成功,工作正常。问题是我无法在实时应用程序中使用它。我的意思是,当我运行我的应用程序并调用 Url.Content("path") 时,它会抛出 null 异常。
例如
public class ExampleController : BaseController
{
public string GetPath()
{
return Url.Content("~/Path/To/File");
}
}
Run Code Online (Sandbox Code Playgroud)
Url.Content在此代码中抛出空异常。它在单元测试中运行良好。我该如何修复该代码?
在这种情况下,确实不需要抽象UrlHelper. 只需模拟测试的助手即可完成所需的操作。
例如,假设
public class ExampleController : Controller {
public string GetContent() {
return Url.Content("~/Path/To/File");
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个测试,模拟UrlHelper使用最小起订量,就像原始示例一样工作
[TestClass]
public class UrlHelperTest {
[TestMethod]
public void MockUrlHelper() {
//Arrange
var expectedPath = "~/Path/To/File";
var expectedContent = "<p>Fake content here<p>";
var urlHelperMock = new Mock<UrlHelper>();
urlHelperMock
.Setup(m => m.Content(expectedPath))
.Returns(expectedContent)
.Verifiable();
var sut = new ExampleController();
sut.Url = urlHelperMock.Object; //Set mock UrlHelper
//Act
var actualContent = sut.GetContent();
//Assert
urlHelperMock.Verify();
Assert.AreEqual(expectedContent, actualContent);
}
}
Run Code Online (Sandbox Code Playgroud)
现在可以执行测试,并且框架将在生产中填充必要的控制器属性,因为从技术上讲,从原始框架到自定义抽象没有任何更改。
| 归档时间: |
|
| 查看次数: |
1217 次 |
| 最近记录: |