gpt4 book ai didi

c# - 如何对使用 ServiceStack 的 JsonServiceClient() 的 ASP.NET MVC 操作进行单元测试?

转载 作者:太空宇宙 更新时间:2023-11-03 16:09:27 26 4
gpt4 key购买 nike

在使用 ASP.NET MVC 时,我对可测试设计有相当深刻的理解,并成功地将这种理解应用于使用 ServiceStack 构建可测试服务。然而,一个非常重要的难题让我难以理解,我如何对依赖于 JsonServiceClient 的 MVC 操作进行单元测试?我知道我可以将 JsonServiceClient 包装在我自己的抽象中,但是是否有基于 ServiceStack 的解决方案?

例如,提供一个使用 DTO 获取行星列表的设计服务:

public class PlanetsService : Service
{
public IRepository Repository { get; set; } // injected via Funq

public object Get(PlanetsRequest request)
{
var planets = Repository.GetPlanets();

return new PlanetsResponse{ Planets = planets };
}
}

假设我有一个简单的 MVC 操作,它使用 JsonServiceClient 获取数据,做一些工作,然后返回一个包含我的行星列表的 View 模型的 View :

public class PlanetsController : Controller
{
private readonly IRestClient _restClient; // injected with JsonServiceClient in AppHost

public PlanetsController(IRestClient restClient)
{
_restClient = restClient;
}

public ActionResult Index()
{
var request = new PlanetsRequest();
var response = _restClient.Get(request);

// maybe do some work here that we want to test

return View(response.Planets);
}
}

我开始在我的单元测试中使用 DirectServiceClient 作为我的 IRestClient,但是 DirectServiceClient.Get(IRequest request) 没有实现(抛出 NotImplementedException)。我的测试使用 NUnit 并继承自 ServiceStack 的 TestBase:

[TestFixture]
public class PlanetsControllerTests : TestBase
{
[Test]
public void Index_Get_ReturnsViewResult()
{
var restClient = new DirectServiceClient(this, new ServiceManager(typeof(PlanetsService).Assembly));
var controller = new PlanetsController(restClient);
var viewResult = controller.Index() as ViewResult;

Assert.IsNotNull(viewResult);
}

protected override void Configure(Funq.Container container)
{
// ...
}
}

所以我想真正的问题是:DirectServiceClient 实际上可以提供给 IRestClient 进行单元测试吗? ServiceStack 是否为我假设的开发人员使用 ServiceStack 和 ASP.NET MVC 的常见场景提供了策略?我是否在 ServiceStack 的产品范围之外工作,也许我应该只编写隐藏 JsonServiceClient 的自己的抽象代码?

我花了很多时间在网上寻找建议,虽然有很多端到端集成测试示例,但似乎没有一个是专门针对我尝试进行单元测试的。

最佳答案

您不能创建自己的 IRestClient 模拟实现吗?或者更好地使用 RhinoMock 之类的东西来模拟界面并设置期望和响应?

例如,使用 RhinoMock(不确定真正的语法,但应该清楚发生了什么):

[Test]
public void Index_Get_ReturnsViewResult()
{
var restClient = MockRepository.GetMock<IRestClient>();
var controller = new PlanetsController(restClient);
restClient.Expect(c => c.Get(null)).IgnoreArguments().Return(new PlanetsResponse{ /* some fake Planets */ });
var viewResult = controller.Index() as ViewResult;

Assert.IsNotNull(viewResult);
// here you can also assert that the Model has the list of Planets you injected...
}

关于c# - 如何对使用 ServiceStack 的 JsonServiceClient() 的 ASP.NET MVC 操作进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18043741/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com