oSR*_*oSR 10 c# unit-testing moq xunit asp.net-web-api
我正在研究这个WebAPI项目,我需要为它创建单元测试.项目的基础是使用VS 2010创建的,然后添加了WebApi模块.
控制器的工作方式有点妨碍测试/模拟.我正在使用xUnit和Moq,但绝对没有必要坚持使用这两个.
应用程序使用特定对象来处理数据库访问,因此我有controllerObject及其构造函数需要DataAccessObject
我在模拟控制器/数据访问对时遇到问题.我试图运行的第一个测试是一个GetAllFromDataBase,但我真的不知道如何做到这一点.
编辑:
我做了Cuong Le告诉我的事情,整个现在正在移动,我真的很喜欢它.但我难以接受另一个问题.要访问API,有一个用户名/密码对,我的控制器使用Thread.CurrentPrincipal.Identity.Name; 现在我需要设置这个值才能完全正常工作.
还有valueServiceMock.Setup(service => service.GetValues()).Returns(new [] {"value1","value2"});
似乎不起作用.因为代码试图访问数据库,并且因为它无法获得有效的用户名而无法获取任何内容
cuo*_*gle 22
为了让您的应用程序可测试,您需要设计可测试性.从技术上讲,为了设计可测试性,您的应用程序应尽可能在层之间,组件之间甚至类之间进行松散耦合.
设计可测试性的很多提示:避免密封,静态类...但是你需要注意的最受欢迎的是依赖注入模式,而不是在构造函数或其他对象的方法中创建对象,这个对象应该被注入.通过这种方式,我们可以在类之间进行松散的依赖,并且通过模拟框架可以轻松伪造.Esp,用于依赖外部资源的对象:网络,文件或数据库.
如何通过使用依赖注入来注入对象:这就是为什么IocContainer是正确的工具,它将自动为您注入对象.我更喜欢使用的IoC Container是:Autofac和NInject.
这里将ValueService注入ValuesController的示例:
public class ValuesController : ApiController
{
private readonly IValueService _valueService;
public ValuesController(IValueService valueService)
{
_valueService = valueService;
}
public string[] Get()
{
return _valueService.GetValues();
}
public string Get(int id)
{
return _valueService.GetValue(id);
}
}
Run Code Online (Sandbox Code Playgroud)
以下是使用Moq进行单元测试的简单代码:
var valueServiceMock = new Mock<IValueService>();
valueServiceMock.Setup(service => service.GetValues())
.Returns(new[] { "value1", "value2" });
var controller = new ValuesController(valueServiceMock.Object);
var values = controller.Get();
Assert.AreEqual(values.Length, 2);
Assert.AreEqual(values[0], "value1");
Assert.AreEqual(values[1], "value2");
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
22717 次 |
最近记录: |