问题描述
我为我的asp.net零项目每个https://aspnetboilerplate.com/Pages/Documents/Articles/Using-Stored-Procedures,-User-Defined-Functions-and-Views/index.html创建了一个自定义存储库。当我使用Swagger API测试应用程序以及从我的有角度的客户端进行测试时,一切工作都很好。然后,我尝试使用我得到的asp.net零测试框架为API编写自动化测试 System.AggregateException:发生一个或多个错误。 (CommandType'StoredProcedure'无效。) ---- System.ArgumentException:CommandType'StoredProcedure'无效。”
似乎测试框架正在使用sqlLite作为数据库上下文。我不确定如何解决此问题。
测试失败
[Fact]
public void Should_Get_All_StaticItems()
{
LoginAsTenant("Default","admin");
//Act
**var types = _ptStaticDataTypeAppService.Get(new PTGetPTStaticDataTypeinput());**
//Assert
types.Result.Count.ShouldBe(_totalItems);
}
APP服务方法
[AbpAuthorize(AppPermissions.Pages_Administration_PT_StaticDataType)]
public class PTStaticDataTypeAppService : PieceTrackerAppServiceBase,IPTStaticDataTypeAppService
{
IPTStaticDataTypeRepository _ptStaticDataRepository;
public PTStaticDataTypeAppService(IPTStaticDataTypeRepository ptStaticDataTypeRepository)
{
_ptStaticDataRepository = ptStaticDataTypeRepository;
}
public async Task<List<PTGetPTStaticDataTypeForViewDto>> Get(PTGetPTStaticDataTypeInput input)
{
return await _ptStaticDataRepository.Get(input);
}
存放
public class PTStaticDataTypeRepository : PieceTrackerRepositoryBase<PTStaticDataType,long>,IPTStaticDataTypeRepository
{
private readonly IActiveTransactionProvider _transactionProvider;
public PTStaticDataTypeRepository(IDbContextProvider<PieceTrackerDbContext> dbContextProvider,IActiveTransactionProvider transactionProvider)
: base(dbContextProvider)
{
_transactionProvider = transactionProvider;
}
public async Task<List<PTGetPTStaticDataTypeForViewDto>> Get(PTGetPTStaticDataTypeInput input)
{
var data = new List<PTGetPTStaticDataTypeForViewDto>();
var cn = Context.Database.GetDbConnection();
if (cn.State != ConnectionState.Open)
await cn.OpenAsync();
using (var cmd = cn.CreateCommand())
{
cmd.CommandText = "usp_GetPTStaticDataType";
**cmd.CommandType = CommandType.StoredProcedure;**
解决方法
测试框架使用内存中的SQL Lite DB通过SQL命令传递。因此,我在自定义存储库中创建了一种解决方法。
private DbConnection GetSqlConnection()
{
const string TESTINGDB = "memory";
const string PTCONNSTRING = "Server=(local); Database=PieceTrackerDb; Trusted_Connection=True;";
var cn = Context.Database.GetDbConnection();
if (cn.ConnectionString.Contains(TESTINGDB))
{
cn = new SqlConnection(PTCONNSTRING);
}
var logMsg = "PTStaticDataTypeRepository.Get Connection String = " + cn.ConnectionString;
Console.WriteLine(logMsg);
return cn;
}