C# 如何对带有事务的WebAPI控制器进行集成测试
我刚刚听说了集成测试数据库触控逻辑的有趣方法:使用事务在staging或dev数据库上准备测试夹具,执行请求,然后回滚事务 所以,这个方法对我来说似乎很有趣,因为我们可以测试Web API控制器,将事务处理到临时数据库或本地数据库,而不需要接触任何实际数据。特别是MS SQL提供了事务DDL,我们甚至可以在事务中运行“创建数据库”查询 我正在尝试对ApicController进行如下测试:C# 如何对带有事务的WebAPI控制器进行集成测试,c#,sql-server,asp.net-web-api,automated-tests,integration-testing,C#,Sql Server,Asp.net Web Api,Automated Tests,Integration Testing,我刚刚听说了集成测试数据库触控逻辑的有趣方法:使用事务在staging或dev数据库上准备测试夹具,执行请求,然后回滚事务 所以,这个方法对我来说似乎很有趣,因为我们可以测试Web API控制器,将事务处理到临时数据库或本地数据库,而不需要接触任何实际数据。特别是MS SQL提供了事务DDL,我们甚至可以在事务中运行“创建数据库”查询 我正在尝试对ApicController进行如下测试: namespace MyApiTest { [TestClass] public clas
namespace MyApiTest
{
[TestClass]
public class TestMyController
{
private IDbConnection connection = null;
private TransactionScope transactionScope = new TransactionScope();
private HttpConfiguration _configuration = null;
private IContainer container = null;
string localDbConnectionString = @"Server=(localdb)\MSSQLLocalDB;Integrated Security=true";
private void CreateContainer()
{
var builder = new ContainerBuilder();
builder.Register(ctx => new SqlConnection(localDbConnectionString)).As<IDbConnection>().SingleInstance();
builder.RegisterType<MyRepositorySql>().As<MyRepository>();
container = builder.Build();
}
public void CreateTestDb()
{
string script = $@"some SQL queries, creating tables, inserting initial data";
connection.Execute(script);
}
[TestInitialize]
public void InitFixture()
{
CreateContainer();
_configuration = new HttpConfiguration
{
DependencyResolver = new AutofacWebApiDependencyResolver(container)
};
connection = container.Resolve<IDbConnection>();
string createDb = $@"sql query, creating database";
connection.Open();
connection.Execute(createDb);
CreateTestDb();
}
[TestMethod]
public async Task TestCRUD()
{
var controller = new MyController(container.Resolve<MyRepository>());
var newItem = await controller.CreateItem(new Item()
{
W = 10,
H = 11,
X = 12,
Y = 13
}); // this request works
// Id must be 1, because of auto-increment
var retrievedItem = await controller.GetItemById(1); // this request fails
// "ConnectionString not initialized" error
// I think it fails because the connection was disposed
// after previous request (using(){} block inside the CreateItem method)
// there I want to do some test assertions
}
}
}
namespace MyApiTest
{
[测试类]
公共类TestMyController
{
私有IDbConnection=null;
private TransactionScope TransactionScope=新TransactionScope();
私有HttpConfiguration _configuration=null;
私有IContainer容器=null;
字符串localDbConnectionString=@“服务器=(localdb)\MSSQLLocalDB;集成安全性=true”;
私有void CreateContainer()
{
var builder=new ContainerBuilder();
Register(ctx=>newsqlconnection(localDbConnectionString)).As().SingleInstance();
builder.RegisterType().As();
container=builder.Build();
}
public void CreateTestDb()
{
字符串脚本=$@“一些SQL查询、创建表、插入初始数据”;
执行(脚本);
}
[测试初始化]
公共设备
{
CreateContainer();
_配置=新的HttpConfiguration
{
DependencyResolver=新的AutoFacWebAPI DependencyResolver(容器)
};
connection=container.Resolve();
字符串createDb=$@“sql查询,创建数据库”;
connection.Open();
执行(createDb);
CreateTestDb();
}
[测试方法]
公共异步任务TestCRUD()
{
var controller=newmycontroller(container.Resolve());
var newItem=await controller.CreateItem(新项()
{
W=10,
H=11,
X=12,
Y=13
});//这个请求有效
//由于自动递增,Id必须为1
var retrievedItem=await controller.GetItemById(1);//此请求失败
//“ConnectionString未初始化”错误
//我认为它失败是因为连接已被处理
//在上一个请求之后(在CreateItem方法中使用(){}块)
//在这里,我想做一些测试断言
}
}
}
那么,我怎样才能正确地进行测试呢?可能存在某种可能性,可以禁止在中使用(){}
块处理连接,对SqlConnection
类或其他东西进行猴子补丁?或者我完全误解了方法,做了所有错事