SharpRepository单元测试CacheRepository无法添加多个项目

时间:2014-03-24 16:18:42

标签: c# entity-framework unit-testing sharp-repository

我们在EntityFramework 6之上使用SharpRepository,到目前为止工作得很好。我们还在实施完整的单元测试,在研究批准的方法进行单元测试时,SharpRepository与CacheRepository一起使用,这使我们可以使用一致的测试数据填充repo,然后针对这些测试存储库测试服务和模型。这也是大部分工作。

问题

我们用一个对象成功填充了这些repos,然后我们可以拉出该对象并对其进行测试。但是一个新的测试用例,要求我们对多个条目进行测试,当我们添加它们时,只有最后一个条目在Repo中实际可用。我从单元测试输出中看到这一点,并在调试时检查监视窗口中的repo,它只有一个。

我已经设置了标准缓存策略和内存提供程序,我还尝试使用Add函数单独添加每个对象并作为列表添加。

守则

设置

    [TestInitialize]
    public void Initialize()
    {
        var sharpRepositoryConfiguration = new SharpRepositoryConfiguration();
        sharpRepositoryConfiguration.AddCachingStrategy(new StandardCachingStrategyConfiguration("standard"));
        sharpRepositoryConfiguration.AddCachingProvider(new InMemoryCachingProviderConfiguration("inmemory"));
        sharpRepositoryConfiguration.AddRepository(new CacheRepositoryConfiguration("textFilter", "TextFilter", "standard", "inmemory"));

        textFilterRepo = sharpRepositoryConfiguration.GetInstance<TextFilter, int>("textFilter");
    }

    [TestCleanup]
    public void CleanUp()
    {
        textFilterRepo.Delete(c => true);
    }

这些方法只应分别在每个测试方法之前和之后调用,因此不应该在方法本身内引起问题。

添加

        List<TextFilter> badwords;
        var badword1= new TextFilter
        {
            ID = 0,
            FilterType = 1,
            FilterText = "badword1",
            DateTimeCreated = DateTime.Now
        };
        var badword2 = new TextFilter
        {
            ID = 1,
            FilterType = 1,
            FilterText = "badword2",
            DateTimeCreated = DateTime.Now
        };
        var badword3 = new TextFilter
        {
            ID = 2,
            FilterType = 1,
            FilterText = "badword3",
            DateTimeCreated = DateTime.Now
        };

        badwords = new List<TextFilter>
        {
            badword1,
            badword2,
            badword3
        };

        textFilterRepo.Add(badwords);

正如我之前所说,我已经尝试过单独添加电话和现在的列表,结果相同。

编辑: SharpRepositorySettings 我不确定为什么CacheUsed设置为false,我没有其他设置,但我想知道这是否是问题的一部分,如果我需要明确调用某些东西让它工作

研究

我对此进行了相当广泛的研究,包括一般的Sharp Repository和具体的单元测试。

我已经看过这个SO,这导致我使用CacheRepository,How can I seed SharpRepository's InMemoryRepository?。但我无法找到有关此信息的任何信息。可能是我已经错误地设置了存储库的缓存,但这就是我所看到的示例中的典型情况。我已经在许多单元测试中成功使用了它,但之前不必填充多个值。

请求

我正在寻找帮助,以确定为什么此设置无法向其添加多个对象的缓存,以及我如何更改此代码,或者我的单元测试设置通常能够容纳多个我的CacheRepository中的对象。

1 个答案:

答案 0 :(得分:0)

所以我终于跳进了Sharp Repo源代码,发现了我的问题。首先我会道歉,其中大部分都可以避免,我清理了我的代码示例和命名约定,使其更容易阅读,这掩盖了我的键值与Sharp Repo的命名约定不匹配。问题是,锐利使用基于约定的ID映射(这实际上是一个巨大的便利)。

enter image description here enter image description here

对于那些感兴趣的人我通过跟踪CacheRepositoryBase.cs中的AddItem方法找到了这个。特定于约定的代码在DefaultRepositoryConventions.cs中,如果您遇到可能值得检查的问题,您需要提取源代码以便明确查看,但对于未来的知识寻求者。

值得一提的是,我还可以使用[RepositoryPrimaryKey]属性,以及重命名我的属性以符合约定,两者都同样有效。通过使用MetaData分部类,注释对自动生成的EF实体特别有用。

非常感谢@JeffTreuting,感谢您的帮助。