为 ObjectContext 创建接口

2024-01-27

我正在尝试创建一个抽象层ObjectContext。我理解 OC 是一个工作单元,但我并不完全了解如何为它编写一个好的界面。理想情况下,我希望能够交换实现的“RealDataContext”IDataContext对于像“FakeDataContext”这样完全位于内存中的东西。

这样做的原因是我希望能够针对内存数据库测试我的存储库。

Thanks!


您应该能够创建一个派生自 ObjectContext 的扩展类,并实现 IDataContext 接口。为了真正能够模拟 ObjectContext,您的 IDataContext 接口需要包含您正在使用并希望模拟的任何 ObjectContext 成员的匹配签名(或属性)。像下面这样的东西就足够了:

interface IDataContext, IDisposable
{
    void AddObject(string entitySetName, object entity);
    void Attach(IEntityWithKey entity);
    void Detach(object entity);
    void DeleteObject(object entity);
    int SaveChanges();
    int SaveChanges(bool acceptChangesDuringSave);
    int SaveChanges(SaveOptions options);

    // Any other members you wish to be mockable
}

class DataContext: ObjectContext, IDataContext
{
    // nothing here
}

从技术上讲,由于 DataContext 继承了 ObjectContect 的所有内容,因此 IDataContext 的实现由 ObjectContext 负责。您不需要在 DataContext 类中进行任何额外的实现。只要您始终注入(或使用工厂来创建)IDataContext 而不是 ObjectContext 的实例,您就应该能够在测试时模拟 IDataContext:

class SomeEntityRepository: IRepository<SomeEntity>
{
    public SomeEntityRepository(IDataContext context)
    {
        m_context = context;
    }

    private readonly IDataContext m_context;

    public SomeEntity GetById(long id)
    {
        // implementation
    }
}

// xUnit.NET & Moq
class SomeEntityRepositoryTests
{
    [Fact]
    public void GetById_returns_entity_when_valid_id_is_passed()
    {
        // state and context
        var mockContext = new Mock<IDataContext>();

        // arrangement
        mockContext.Setup(/* configure mock context here */);
        var repo = new SomeEntityRepository(mockContext.Object);

        // activity
        var entity = repo.GetById(100);

        // assertions
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为 ObjectContext 创建接口 的相关文章

随机推荐

  • eclipse ASTNode 到源代码行号

    给定eclipse中的ASTNode 有没有办法获取对应的源代码行号 您可以获取某个行的行号ASTNode使用下面的代码 int lineNumber compilationUnit getLineNumber node getStartP
  • 在 PHP 中将粗俗分数转换为数字

    如何将粗俗的分数转换为 PHP 可以用来计算其值的值 例如 3 4 l echo utf8 encode l ord l bin2hex l chr l 会输出类似这样的内容 194 c2be 我们怎样才能把它变成3 4 当从字符串中提取分
  • jQuery 按属性值过滤

    div class selectedColumns a href Driver License State a a href Email a a href Experience Level a a href First Name a a h
  • MySQL存储过程-如何获取最后插入的ID

    我创建了一个存储过程 它将一条记录插入表中并获取该记录的自动递增 ID 我在设置时遇到语法错误LAST INSERT ID 到一个变量中 ERROR 1064 42000 您的 SQL 语法有错误 检查 与您的 MySQL 服务器版本相对应
  • 通过 id 删除骨干模型?

    可以通过id删除模型吗 文档说您需要传入模型本身才能将其删除 所以我需要先获取模型然后删除它 我不能直接通过id删除它吗 您的意思是从集合中删除模型吗 查看文档 似乎您确实需要传递一个真实的模型 但源代码表明您可以只传递一个模型id或型号c
  • 具有唯一键的javascript和es6过滤器数组

    我有一个变量列表 例如 var name list some list console log name list Array 3 0 Object name Johny 1 Object name Monty 2 Object3 name
  • 统一加速

    我正在尝试在 Unity 中模拟加速和减速 我编写了代码来在 Unity 中生成轨道 并根据时间将对象放置在轨道上的特定位置 结果看起来有点像这样 我目前遇到的问题是样条线的每个部分都有不同的长度 并且立方体以不同但均匀的速度穿过每个部分
  • 指定父级 div 的不透明度,但使其不影响子级 HTML 元素

    我在 div 中有一个段落元素 div 的不透明度为 0 3 段落的不透明度为 1 当我显示元素时 该段落看起来是透明的 就像它的不透明度为 0 3 一样 有没有办法让div内的段落完全不透明 也许我可以为此设置一个 CSS 值 div s
  • 跳过没有装饰器语法的单元测试

    我有一套使用 TestLoader 的 来自单元测试模块 loadTestsFromModule 方法加载的测试 即 suite loader loadTestsFromModule module 这给了我一个非常充足的 运行良好的测试列表
  • 在Android模拟器中添加铃声

    有谁知道如何向 Android 模拟器添加 下载铃声或 mp3 声音 Go to DDMS in Eclipse 点击File Explorer选项卡并导航至mnt sdcard 单击创建新文件夹Plus图标称为ringtones 然后单击
  • 哪里可以找到 Android 示例?

    我检查了谷歌开发者网站上的一些 Android 开发练习和示例 我发现了这个网页 http developer android com tools samples index html http developer android com
  • Haskell - 非法多态类型?

    为什么该类型单独使用可以编译 但放入列表却失败 ft1 Foldable t Num a gt t a gt a ft1 F foldl 0 fTest Foldable t Num a gt t a gt a fTest F foldl
  • Django Cripy-Forms 找不到 CSS

    我正在使用 Django 和 Crispy Forms 我可以正确呈现表单 但不会出现 CSS 格式 我需要做什么 我已经添加了 CRISPY TEMPLATE PACK bootstrap to my settings py file h
  • 如何让 django 在继续完成与请求相关的任务之前给出 HTTP 响应?

    在我的 django 活塞 API 中 我想在调用另一个需要相当长的时间的函数之前向客户端产生 返回一个 http 响应 如何使yield 给出包含所需JSON 的HTTP 响应 而不是与生成器对象创建相关的字符串 我的活塞处理程序方法如下
  • 如何读取属性文件并使用项目 Gradle 脚本中的值?

    我正在开发一个 Gradle 脚本 我需要阅读local properties文件并使用属性文件中的值build gradle 我正在按照以下方式进行操作 我运行了下面的脚本 它现在抛出一个错误 但它也没有执行任何操作 例如创建 删除和复制
  • Django-CKEditor 不会渲染图像

    我已经安装了 Django CKEditor 并对其进行了配置以用于开发目的 现在我可以编辑文本并将其作为文本字段保存到数据库中 但是在插入图像时我遇到了很大的问题 我可以插入图像 它似乎可以正确保存到本地主机 正确的文件夹 但是当将图像渲
  • 如何更改 setInterval 和 setTimeout 函数中“this”的范围

    怎么可能使用this代替setInterval and setTimeout calls 我想这样使用它 function myObj this func function args setTimeout function this fun
  • 如何解决Require.js中的循环依赖?

    基本上 这个想法是 子 模块创建一个对象 并且该对象应该是作为 主 模块的实用程序库的一部分 然而 子 对象depends关于 main 的实用程序 Main module define sub function sub var utils
  • NameError:未初始化的常量 Bundler

    我刚刚将我的网络服务器更改为 Puma 并且必须将我的开发数据库从 sqlite 更改为 postgresql 但现在每次我尝试运行 rake db migrate 时都会收到此错误 rake aborted NameError unini
  • 为 ObjectContext 创建接口

    我正在尝试创建一个抽象层ObjectContext 我理解 OC 是一个工作单元 但我并不完全了解如何为它编写一个好的界面 理想情况下 我希望能够交换实现的 RealDataContext IDataContext对于像 FakeDataC