Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何对带有事务的WebAPI控制器进行集成测试_C#_Sql Server_Asp.net Web Api_Automated Tests_Integration Testing - Fatal编程技术网

C# 如何对带有事务的WebAPI控制器进行集成测试

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

我刚刚听说了集成测试数据库触控逻辑的有趣方法:使用事务在staging或dev数据库上准备测试夹具,执行请求,然后回滚事务

所以,这个方法对我来说似乎很有趣,因为我们可以测试Web API控制器,将事务处理到临时数据库或本地数据库,而不需要接触任何实际数据。特别是MS SQL提供了事务DDL,我们甚至可以在事务中运行“创建数据库”查询

我正在尝试对ApicController进行如下测试:

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
类或其他东西进行猴子补丁?或者我完全误解了方法,做了所有错事