1

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

问题

我们已经使用单个对象成功填充了这些存储库,然后我们可以将该对象拉出并对其进行测试。但是一个新的测试用例要求我们针对多个条目进行测试,当我们添加它们时,只有最后一个条目实际上在 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,如何为 SharpRepository 的 InMemoryRepository 播种?. 但我无法找到有关此信息的任何信息。可能是我错误地设置了存储库的缓存,但这就是我看到的示例中通常的样子。我已经在许多单元测试中成功地使用了它,但之前不必填充多个值。

要求

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

4

1 回答 1

0

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

在此处输入图像描述 在此处输入图像描述

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

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

非常感谢@JeffTreuting,因为这是帮助。

于 2014-03-25T13:48:45.657 回答