【问题标题】:How to test my linq repository calls如何测试我的 linq 存储库调用
【发布时间】:2011-08-16 10:25:00
【问题描述】:

我有以下 UserRepository:

public class UserRepository : Repository<Entities.User> {

public Entities.IUser Find(string domain, string username, string password) {
            return (from u in FindAll()
                    where u.Account.SubDomain == domain && u.EmailAddress == username && u.PasswordHash == password
                    && !u.IsArchived
                    select u).FirstOrDefault();
        }
}

“FindAll”方法是 Repository 的一部分,基本上只是调用 context.GetTable().AsQueryable()

我希望能够编写一个调用此存储库方法的测试,但不是访问数据库,而是使用一些内存存储。

我已经做了很多搜索,我似乎遇到的所有内容都在谈论模拟存储库并返回一个列表(通常在单元测试开始时创建),但我不明白它有什么用.我想确保我编写的 linq 查询实际上是正确过滤对象并仅检索所需的记录。 由于 DataContext 没有接口,我不能简单地对其进行模拟。

我认为处理此问题的唯一其他方法是实际与数据库对话,但我知道这不是单元测试的重点。

我的问题是其他人是如何处理这个问题的?

【问题讨论】:

    标签: unit-testing linq-to-sql tdd


    【解决方案1】:

    你不需要一个接口来模拟事物。您可以轻松地创建一个派生自 DataContext 的模拟并将其传递到您的存储库中。

    【讨论】:

    • 我该怎么做呢?
    • 我不确定我是否理解。你有什么问题?创建一个从 DataContext 派生的模拟类? class MockDataContext : DataContext { /* ... */ } 或将其注入存储库?
    • 对不起,我是新手。你是说我应该创建这个 MockDataContext 然后使用 StructureMap 在使用我常用的数据上下文的地方注入这个?那是否可以让我使用 moq 来说明何时在我的正常数据上下文上调用 gettable 以返回我需要的对象的 iqueryable 列表,这样我实际上并没有与实时数据库交谈。
    • @Gazeth:我查看了 DataContext 类。并非所有公共成员都是虚拟的(事实上,大多数不是),所以,您不能使用 Moq 来创建模拟。在这种情况下,最好的方法是使用 Moles 或 TypeMock 来拦截对 DataContext 的调用并提供模拟。
    • 那不是假的,而不是模拟的吗?
    【解决方案2】:

    感谢@Daniel Higarths 上面的最后评论,他提到了 Moles,这帮助我解决了这个问题以及以下视频 http://dimecasts.net/Content/WatchEpisode/170

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 2014-06-19
      • 2014-10-07
      • 1970-01-01
      相关资源
      最近更新 更多