Mit*_*h A 4 asp.net-mvc integration-testing mvccontrib
我正在开发一个新的MVC应用程序,该应用程序将主要使用TDD编写.我想补充一些集成测试,以确保完全有线应用(我用StructureMap海委会,NHibernate的持久性)按预期工作.
虽然我打算用Selenium编写一些功能性烟雾测试,但出于可维护性的原因,我宁愿通过使用旧的C#在我的控制器上直接调用操作来进行大部分集成测试.
关于如何实现这一目标的指导令人惊讶,因此我对攻击计划进行了抨击
我已经完成了第1步,但实际上不知道如何继续第2步.任何指导都将不胜感激.
public class Bootstrapper
{
public static void Bootstrap()
{
DependencyResolverInitializer.Initialize();
FilterConfig.RegisterFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
ModelBinders.Binders.DefaultBinder = new SharpModelBinder();
}
}
public class DependencyResolverInitializer
{
public static Container Initialize()
{
var container = new Container();
container.Configure(x => x.Scan(y =>
{
y.Assembly(typeof(Webmin.UI.FilterConfig).Assembly);
y.WithDefaultConventions();
y.LookForRegistries();
}));
DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));
return container;
}
}
public class StructureMapDependencyResolver : IDependencyResolver
{
private readonly IContainer _container;
public StructureMapDependencyResolver(IContainer container)
{
_container = container;
}
public object GetService(Type serviceType)
{
if (serviceType.IsAbstract || serviceType.IsInterface) {
return _container.TryGetInstance(serviceType);
}
return _container.GetInstance(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return _container.GetAllInstances(serviceType).Cast<object>();
}
}
Run Code Online (Sandbox Code Playgroud)
如果您希望在不通过UI的情况下对ASP.NET MVC应用程序进行自动端到端测试,那么一种好的方法是以编程方式将HTTP请求发送到不同的URL并在之后断言系统的状态.
您的集成测试基本上如下所示:
您可以使用CassiniDev轻松地在进程内 Web服务器中托管ASP.NET Web应用程序.此外,以编程方式发送HTTP请求的一种便捷方式是使用Microsoft ASP.NET Web API客户端库.
这是一个例子:
[TestFixture]
public class When_retrieving_a_customer
{
private CassiniDevServer server;
private HttpClient client;
[SetUp]
public void Init()
{
// Arrange
server = new CassiniDevServer();
server.StartServer("..\relative\path\to\webapp", 80, "/", "localhost");
client = new HttpClient { BaseAddress = "http://localhost" };
}
[TearDown]
public void Cleanup()
{
server.StopServer();
server.Dispose();
}
[Test]
public void Should_return_a_view_containing_the_specified_customer_id()
{
// Act
var response = client.GetAsync("customers/123").Result;
// Assert
Assert.Contains("123", response.Content.ReadAsStringAsync().Result);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您正在寻找这个技术的更完整示例,您可以在我的示例MVC 4 Web应用程序中找到它,我在编写自动验收测试的上下文中展示了它.
| 归档时间: |
|
| 查看次数: |
2361 次 |
| 最近记录: |