如何模拟 System.Data.Linq.Table

发布于 2024-10-04 12:48:05 字数 1266 浏览 2 评论 0 原文

我的一个基本存储库类包含一种方法:

public abstract class RepositoryBase<T, TDb> : IRepository<T>
    where T : IEntity
    where TDb : class, IDbEntity, new()
{
    protected internal abstract Table<TDb> GetTable();
    ...
}

我正在为派生存储库类编写单元测试,其中包含上述方法的实现:

public class CmOptionRepository : 
    RepositoryBase<ICmOption, CMCoreDAL.DbData.CMOption>, ICmOptionRepository
{
    protected internal override System.Data.Linq.Table<CMCoreDAL.DbData.CMOption>
        GetTable()
    {
        return Context.CMOptions;
    }

....
}

此处:上下文 - 是 DB 的 Linq 模型,CMOptions - 数据库表之一。

我希望我的“GetTable()”方法返回一组特殊的数据。

我要模拟该方法:

        System.Data.Linq.Table<CMCoreDAL.DbData.CMOption> table = ...;
        Mock<CmOptionRepository> mockRepository =
            new Mock<CmOptionRepository>(MockBehavior.Strict);
        mockRepository.Setup(mock => mock.GetTable()).Returns(table);

但不知道如何创建 System.Data.Linq.Table 类的实例。

问题:如何模拟 System.Data.Linq.Table?或者我可能需要更改方法签名以避免使用 System.Data.Linq.Table 类?

请指教。欢迎任何想法。

PS 我正在使用起订量。

One of my base repository classes contains a method:

public abstract class RepositoryBase<T, TDb> : IRepository<T>
    where T : IEntity
    where TDb : class, IDbEntity, new()
{
    protected internal abstract Table<TDb> GetTable();
    ...
}

I am writing unit test for derived repository class that contains implementation of mentioned method:

public class CmOptionRepository : 
    RepositoryBase<ICmOption, CMCoreDAL.DbData.CMOption>, ICmOptionRepository
{
    protected internal override System.Data.Linq.Table<CMCoreDAL.DbData.CMOption>
        GetTable()
    {
        return Context.CMOptions;
    }

....
}

Here: Context - is Linq-model of DB, CMOptions - one of the DB tables.

I want my 'GetTable()' method returning a special set of data.

I am going to mock the method:

        System.Data.Linq.Table<CMCoreDAL.DbData.CMOption> table = ...;
        Mock<CmOptionRepository> mockRepository =
            new Mock<CmOptionRepository>(MockBehavior.Strict);
        mockRepository.Setup(mock => mock.GetTable()).Returns(table);

But don't know how to create an instance of System.Data.Linq.Table<CMCoreDAL.DbData.CMOption> class.

Question: how can I mock the System.Data.Linq.Table<>? Or probably I need to change method signature in order to avoid System.Data.Linq.Table<> class usage?

Please advise. Any thoughts are welcome.

P.S. I am using Moq.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

一腔孤↑勇 2024-10-11 12:48:05

如果您使用的是 .NET 4.0,Table 会实现 ITable,因此您应该在以下位置使用接口 ITableGetTable 的返回类型而不是具体类型。然后你就可以嘲笑了。

在 .NET 3.5 中,这有点困难,因为 Table 仅实现 ITable (不是通用的)。

If you are using .NET 4.0, Table<T> implements ITable<T> so that you should use the interface ITable<TDb> in the return type of GetTable instead of the concrete type. Then you can mock away.

In .NET 3.5 it is a little more difficult because Table<T> only implements ITable (not generic).

一向肩并 2024-10-11 12:48:05

您不应该真正在存储库外部公开 Table ,除非明确需要在 Table 实例上执行操作。相反,在存储库中返回 IQueryable,这样更容易模拟。如果您需要执行更新,则可以返回ITable

You shouldn't really expose Table<T> outside of your repository unless there is an explicit need to perform operations on the Table<T> instance. Instead, return IQueryable<T> in your repository, which is easier to mock. If you need to perform updates then you can return ITable<T>.

你的心境我的脸 2024-10-11 12:48:05

我想,这是一个解决方案:

  1. 模拟数据上下文:

    IUnityContainer 容器 = new UnityContainer();
    
    模拟 mockDataContext = new Mock();
    
    容器.RegisterInstance(mockDataContext.Object);
    
    CmOptionRepository mockRepository = new CmOptionRepository(container);
    
  2. 模拟返回表:

    Mock>> mockTable = new Mock>();
    
    mockDataContext.Setup(mock =>mock.CMOptions).Returns(mockTable.Object);
    
  3. 模拟“表”对象功能:

    模拟表
        .Setup(模拟 => 模拟.Select(
             It.IsAny>()
        ))
        .返回(选项);
    

说实话,我不确定它是否有效,明天会检查,但现在至少已经编译好了。

I guess, here is a solution:

  1. Mock data context:

    IUnityContainer container = new UnityContainer();
    
    Mock<IDataContext> mockDataContext = new Mock<IDataContext>();
    
    container.RegisterInstance(mockDataContext.Object);
    
    CmOptionRepository mockRepository = new CmOptionRepository(container);
    
  2. Mock returning table:

    Mock<System.Data.Linq.Table<CMCoreDAL.DbData.CMOption>> mockTable = new Mock<System.Data.Linq.Table<CMCoreDAL.DbData.CMOption>>();
    
    mockDataContext.Setup(mock => mock.CMOptions).Returns(mockTable.Object);
    
  3. Mock 'table' object functionality:

    mockTable
        .Setup(mock => mock.Select(
             It.IsAny<Func<CMCoreDAL.DbData.CMOption, ICmOption>>()
        ))
        .Returns(options);
    

To be honest, I not sure if it will works, will check tomorrow, but now it is at least been compiled.

听你说爱我 2024-10-11 12:48:05

抽象出您的数据访问代码并使用存储库模式。

Abstract away your data access code and use the repository pattern.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文