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

C# SharpRepository单元测试CacheRepository无法添加多个项目,c#,entity-framework,unit-testing,sharp-repository,C#,Entity Framework,Unit Testing,Sharp Repository,我们在EntityFramework 6上使用SharpRepository,到目前为止效果很好。我们还实施了完整的单元测试,在研究SharpRepository与CacheRepository进行单元测试的认可方法时,这使我们能够使用一致的测试数据填充一个repo,然后根据这些测试存储库测试服务和模型。这在很大程度上也是可行的 问题是,我们已经用一个对象成功地填充了这些repo,然后我们可以拉出该对象并对其进行测试。但是一个新的测试用例要求我们对多个条目进行测试,当我们添加它们时,只有最后一个

我们在EntityFramework 6上使用SharpRepository,到目前为止效果很好。我们还实施了完整的单元测试,在研究SharpRepository与CacheRepository进行单元测试的认可方法时,这使我们能够使用一致的测试数据填充一个repo,然后根据这些测试存储库测试服务和模型。这在很大程度上也是可行的

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

我已经设置了一个标准的缓存策略和inmemory提供程序,我还尝试使用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);
    }
[测试初始化]
公共无效初始化()
{
var sharpRepositoryConfiguration=新的sharpRepositoryConfiguration();
sharpRepositoryConfiguration.AddCachingStrategy(新标准CachingStrategyConfiguration(“标准”));
sharpRepositoryConfiguration.AddCachingProvider(新的InMemoryCachingProviderConfiguration(“inmemory”);
addRepositoryConfiguration.AddRepository(新的CacheRepositoryConfiguration(“textFilter”、“textFilter”、“standard”、“inmemory”);
textFilterRepo=sharpRepositoryConfiguration.GetInstance(“textFilter”);
}
[测试清理]
公共空间清理()
{
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);
列出坏话;
var badword1=新文本过滤器
{
ID=0,
FilterType=1,
FilterText=“badword1”,
DateTimeCreated=DateTime.Now
};
var badword2=新文本过滤器
{
ID=1,
FilterType=1,
FilterText=“badword2”,
DateTimeCreated=DateTime.Now
};
var badword3=新文本过滤器
{
ID=2,
FilterType=1,
FilterText=“badword3”,
DateTimeCreated=DateTime.Now
};
坏词=新列表
{
坏话1,
坏话2,
坏话3
};
textFilterRepo.Add(坏话);
正如我之前所说,我尝试了两个单独的add调用,现在是list,结果相同

编辑: 我不确定为什么CacheUsed设置为false,我没有其他设置,但我想知道这是否是问题的一部分,是否需要显式调用某个函数才能使其工作

研究 我已经对此进行了相当广泛的研究,包括一般的Sharp存储库和专门的单元测试

我看到了这一点,这让我使用了CacheRepository。但是我还没有找到关于这个信息的任何信息。可能是我为存储库设置了不正确的缓存,但在我所看到的示例中通常是这样的。我已经在许多单元测试中成功地使用了它,但以前不必填充多个值

要求
我正在寻找帮助,以确定此设置无法将多个对象添加到其缓存中的原因,以及如何更改此代码,或者我的单元测试设置通常能够容纳缓存存储库中的多个对象。

因此,我最终跳转到Sharp Repo源代码中,并找到了我的问题。首先,我要道歉,这在很大程度上是可以避免的,我清理了我的代码示例和命名约定,使其更易于阅读,这掩盖了我的键值与Sharp Repo的命名约定不匹配。问题在于夏普使用基于约定的ID映射(这实际上是一个巨大的便利)

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

值得一提的是,我还使用了[RepositoryPrimaryKey]属性,并将我的属性重命名为符合约定的属性,这两个属性都同样有效。注释对于使用元数据分部类自动生成的EF实体特别有用


非常感谢@JeffTreuting的帮助。

我已经在SharpRepository项目中创建了一个单元测试,我认为这就是您正在做的,并且它目前通过了。如果您可以创建一个失败的版本,那么这将有助于缩小它的范围。回答有关CacheUsed的问题:当上一次查询使用缓存获取结果时,它是一个设置为true的标志。这有点让人困惑,因为CacheRepository只使用了1个大缓存,但默认情况下不使用缓存功能。缓存是可以添加到任何存储库以缓存结果并使查询和查找更快的东西。因此,这与CacheRepository无关。值得一提的是,我后来遇到了一个问题,要求我在配置参数中设置显式且唯一的前缀,以防止缓存在不同类型之间溢出。同样,对于未来的知识寻求者,请注意,我无法获得[RepositoryPrimaryKey]归因于工作。这不是SharpRepo的失败,问题是EF只允许在现有属性上设置某些attirbutes,从EF Poco的Buddy部分类。这不是那些选择属性之一。我不知道如何处理过去的更新