2

我最近开始使用内存数据库 Effort 对我的实体框架实现进行单元测试。

一切正常,除非我尝试使用 CSV 数据加载器将 CSV 文件中的数据加载到数据库中。

关于如何配置 csvdataloader 的文档似乎很少/不足。

这是我编写的 NUnit 3.0 单元测试之一:

    [Test]
    public void GetBudgetIncomeItems_MultipleValidItems_ReturnList()
    {
        //Prepare and load data
        var dataLoader = new CsvDataLoader(@"<DirectoryOfUnitTestProject>\Data");
        var entityConnection = Effort.EntityConnectionFactory.CreateTransient("name=<NameOfMyCSVFileWithoutCSVExtension/DatabaseName>", dataLoader);
        _serviceContext = new ServiceContext(entityConnection);

        //Execute test
        var items = _query.GetBudgetIncomeItems(new Application {Id = 3});

        //Check results
        //Some assertions
    }

上线抛出异常:

Effort.EntityConnectionFactory.CreateTransient("name=<NameOfMyCSVFileWithoutCSVExtension/DatabaseName>", dataLoader);

异常详情:

System.ArgumentException 未被用户代码处理
HResult=-2147024809 Message=Connectionstring 未找到 参数名称:entityConnectionString ParamName=entityConnectionString
Source=Effort StackTrace:在 Effort.EntityConnectionFactory.GetFullEntityConnectionString(String entityConnectionString) 在 Effort.EntityConnectionFactory.GetEffortCompatibleMetadataWorkspace(String& entityConnectionString)在 Effort.EntityConnectionFactory.CreateTransient(String entityConnectionString, IDataLoader dataLoader) 在 Infrastructure.EF6.UnitTests.PacsQueryTests`1.GetBudgetIncomeItems_MultipleValidItems_ReturnList() 在 \PacsQueryTests.cs:line 36 InnerException:

任何帮助,将不胜感激...

更新

根据下面@Evk 的评论,首先使用代码时,您必须使用 DbConnection 和 DbConnectionFactory 类,而不是 EntityConnection 和 EntityConnectionFactory 类。

我更新的代码不会引发任何错误,如下所示:

        [Test]
        public void GetBudgetIncomeItems_MultipleValidItems_ReturnList()
        {
            //Prepare and load data
            Effort.DataLoaders.IDataLoader csvDataLoader = new Effort.DataLoaders.CsvDataLoader(@"<DirectoryOfUnitTestProject>\Data");
            var dataLoader = new Effort.DataLoaders.CachingDataLoader(csvDataLoader,false);
            DbConnection dbConnection = Effort.DbConnectionFactory.CreateTransient(dataLoader);
            _serviceContext = new ServiceContext(dbConnection);

            //Execute test
            var items = _query.GetBudgetIncomeItems(new Application {Id = 3});

            //Check results
            //Some assertions
        }
4

1 回答 1

0

我知道我参加这个聚会迟到了,但他们的一篇帖子似乎回答了这个问题。我找了半天。希望在这里发布它会传播这个词。

https://github.com/zzzprojects/EntityFramework-Effort/issues/99

归功于上述原始帖子的作者。

EntityFrameworkEffortManager.ContextFactory = context => new MyContext();
var dataLoader = new EntityDataLoader();
DbConnection dbConnection = DbConnectionFactory.CreateTransient(dataLoader);
var effortContext = new MyContext(dbConnection);
于 2020-08-31T02:53:45.730 回答