使用 Moq 和 EF 4.1 模拟工作单元

2024-06-18

我正在通过 Contoso 示例进行一些 TDD 实践,并且我用于检索学生的测试正在通过。

我创建新学生的测试失败了(尽管实际代码有效),因为我相信 DBContext 没有被嘲笑。

为了通过这个测试,我应该重构什么?

测试失败,如下所示:

Contoso.Tests.Controllers.StudentControllerTest.Create_HttpPost_Should_Save_New_Student: 预计:9 但是是:8

这是具体的工作单元

public class UnitOfWork : IUnitOfWork
{
    private SchoolContext context = new SchoolContext();

    private IStudentsRepository studentsRepository;

    private bool disposed = false;

    public IStudentsRepository StudentsRepository
    {
        get
        {
            if (this.studentsRepository == null)
            {
                this.studentsRepository = new StudentsRepository(context);
            }
            return studentsRepository;
        }
    }


    public void Save()
    {
        context.SaveChanges();
    }


    protected virtual void Dispose(bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                context.Dispose();
            }
        }
        this.disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}

学生控制器

public class StudentController : Controller
{
    private IUnitOfWork _unitOfWork;

    public StudentController(IUnitOfWork unitOfWork)
    {
        this._unitOfWork = unitOfWork;
    }

...

    [HttpPost]
    public ActionResult Create(Student student)
    {
        if (ModelState.IsValid)
        {
            _unitOfWork.StudentsRepository.Add(student);
            _unitOfWork.StudentsRepository.Save();

            return RedirectToAction("Details", new { id = student.StudentID });
        }

        return View(student);
    }

...
}

这是我嘲笑 IUnitOfWork 的地方

    public static IUnitOfWork MockUnitOfWork(List<Student> students)
    {
        var mockUnitOfWork = new Mock<IUnitOfWork>();

        mockUnitOfWork.Setup(x => x.StudentsRepository.Students()).Returns(students.AsQueryable());

        return mockUnitOfWork.Object;
    }

这是失败的测试

private IUnitOfWork unitOfWork = UnitTestHelpers.MockUnitOfWork(testData);
...



    [Test]
    public void Create_HttpPost_Should_Save_New_Student()
    {
        // Arrange
        var studentsCount = unitOfWork.StudentsRepository.Students().Count();
        var controller = new StudentController(unitOfWork);
        var student = Fakes.FakeStudentsData.CreateStudent();

        // Act
        var result = controller.Create(student);

        // Assert
        Assert.AreEqual(studentsCount+1, unitOfWork.StudentsRepository.Students().Count());
        Assert.IsInstanceOf(typeof(RedirectToRouteResult), result);
    }

看起来 StudentRepository 的 Add 方法也需要被模拟。我不确定语法是否正确,但请尝试以下操作:

public static IUnitOfWork MockUnitOfWork(List<Student> students)
{
    var mockUnitOfWork = new Mock<IUnitOfWork>();

    mockUnitOfWork.Setup(x => x.StudentsRepository.Students()).Returns(students.AsQueryable());
    mockUnitOfWork.Setup(x => x.StudentsRepository.Add(It.IsAny<Student>())).Callback<Student>((s) => students.Add(s));

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

使用 Moq 和 EF 4.1 模拟工作单元 的相关文章

  • 如何对这个 Flask 应用程序进行单元测试?

    我有一个 Flask 应用程序 它使用 Flask Restless 来提供 API 我刚刚写了一些身份验证来检查 如果消费者主机被识别 该请求包含一个哈希值 通过加密 POST 的请求内容和 GET 的 URL 以及秘密 API 密钥来计
  • 在使用 SQL 查询的单元测试中模拟 IDocumentQuery

    我正在使用单元测试来测试DocumentDBRepository班级 我跟着这个帖子 https stackoverflow com questions 49906029 mocking idocumentquery in unit tes
  • 如何从命令行(没有 Maven/Gradle)启动 JUnit 5(平台)?

    我想从命令行运行一个包含 JUnit 5 测试的类 不幸的是 我有一些外部依赖项阻止我使用 Maven Gradle 或其他构建系统 在 JUnit 4 中 我可以像这样完成这个任务 java lib org junit runner JU
  • PHPUnit 模拟对象的属性

    我正在寻找一种模拟对象并填充其属性的方法 下面是使用另一个对象的属性的方法的示例 class MyClass private object public function methodUnderTest object this gt obj
  • JqG​​rid 搜索选项:工具栏搜索与标准搜索窗口

    我想允许用户仅使用一个 sopt 设置来过滤每一列 但对于更高级的搜索 对于高级用户 我想允许他们使用内置搜索按钮 但我想覆盖 odata 中列出的各个列搜索选项 例如 我希望我的用户只有 eq 但我希望高级用户能够从 odata 中进行选
  • 单元测试实时/并发软件[重复]

    这个问题在这里已经有答案了 可能的重复 我应该如何对线程代码进行单元测试 https stackoverflow com questions 12159 how should i unit test threaded code 经典的单元测
  • 如何使用 Boost.Test 指定预期会出现异常?

    我有一个 Boost 单元测试用例 它会导致被测对象抛出异常 这就是测试 导致异常 我如何在测试中指定预期特定的异常 我可以使用 BOOST AUTO TEST CASE EXPECTED FAILURES 指定测试应该有一定数量的失败 但
  • MVC 3 Razor Form Post 带多个强类型部分视图不具有约束力

    我很好奇在表单中使用多个强类型部分并回发到包含视图的部分的方法是否是正确的 MVC 处理方法 主视图与以下模型绑定 为简洁起见 省略了其他几个属性和数据注释 public class AccountSetup ViewModelBase p
  • Django SECURE_SSL_REDIRECT 破坏了使用内置客户端的单元测试

    我正在开发一个已经有数百个单元测试的项目 其中许多使用内置的 django 客户端或 django 休息框架 APIClient 来发出请求和测试响应 最近实现了使 SSL 在本地工作的必要条件 并设置SECURE SSL REDIRECT
  • 为什么我的 RSpec 规格运行两次?

    我在我的文件中定义了以下 RSpec 1 3 0 任务Rakefile require spec rake spectask Spec Rake SpecTask new spec do spec spec libs lt lt lib l
  • 如果单元测试如此出色,为什么没有更多的公司这样做呢? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 RhinoMock 或 Moq 测试方法的内部结构

    我对这个嘲笑的事情很陌生 我有几个问题 如我错了请纠正我 模拟不会初始化真正的方法 即模拟不会实际调用类的构造函数 相反 它会执行类似查看类的签名并创建具有该签名但没有任何方法功能的对象的操作 如果您只需要该类型的对象但不想测试它的内部结构
  • 找不到指定文化或中立文化的任何资源

    我必须尝试在这个例子中使用国际化 http afana me post aspnet mvc internationalization part 2 aspx http afana me post aspnet mvc internatio
  • SSDT 单元测试:从配置文件读取 SQL Server 单元测试设置时发生错误

    我在 Visual Studio 2013 professional 中创建了一个数据库项目 然后通过右键单击存储过程之一并选择来添加单元测试创建单元测试 选择创建一个新的VB测试项目 然后右键单击新创建的测试项目并选择SQL Server
  • 错误:超时 - 未在指定的超时内调用异步回调....DEFAULT_TIMEOUT_INTERVAL

    我有一个有角度的服务类 angular module triggerTips service userData function rootScope http log firebase this log service userData S
  • 在 ajax post 之前使用 unobtrusive 进行验证

    所以我一直在玩弄防伪令牌 取得进展 https stackoverflow com questions 7270387 mvc 3 ajax and validateantiforgerytoken谢谢你们 我已经找到了一个解决方案来合并表
  • Asp.Net MVC3 - 如何创建动态 DropDownList

    我发现了很多关于此的文章 但我仍然不知道到底如何做到这一点 我正在尝试创建自己的博客引擎 我有用于创建文章的视图 我首先使用 EF 和代码 现在我必须填写应添加文章的类别数量 但我想将其更改为下拉列表 名称为类别 我的模型看起来是这样的 p
  • 在哪里存储加密密钥 MVC 应用程序

    我正在使用 AES 加密 解密类 该类需要密钥值和向量值来加密和解密 MVC3 应用程序中的数据 保存记录时 我对数据进行加密 然后存储在数据库中 当我检索记录时 我在控制器中解密并将未加密的值传递给视图 我们关心的不是在数据通过网络时保护
  • laravel 4嘲笑模拟模型关系

    假设我有两个模型延伸自Eloquent并且它们彼此相关 我可以嘲笑这段关系吗 ie class Track extends Eloquent public function courses return this gt hasMany Co
  • 如何在mockito中模拟Spring依赖

    我正在尝试嘲笑 Spring Beans 我能够模拟对象 B 和 C 但无法模拟 B 类内的对象 插入类 A 中的模拟包含 B 但 X 和 Y 为空 即使我嘲笑了它们 Mockito 有没有办法模拟 Spring bean 中成员的对象 N

随机推荐

  • 使用 RSpec 测试导轨金属/机架?

    假设我有一个名为 Preview 的 Metal 类 如何使用 RSpec 进行测试 当我尝试时 require spec helper describe Preview do it should return the posted con
  • GLSurfaceView onDrawFrame 清除行为

    我在使用 GLSurfaceView 时遇到了不同的行为 据我所知 程序有责任清除每帧的缓冲区 颜色和深度 这意味着 如果我不清除缓冲区 我将获得最后一帧的内容 或双缓冲的前一帧 似乎无论在某些设备上如何 缓冲区都会被清除 我在一些测试设备
  • Swift 仅删除字符串中的尾随空格

    SO 中的许多示例都固定两侧 即前导和尾随 我的要求只是关于尾随 我的输入文本是 保持我的左侧 期望的输出 保持我的左侧 当然 这个命令会删除两端 let cleansed messageText trimmingCharacters in
  • IClaimsTransformation 未被调用

    我正在开发 ASP NET Core Web 应用程序 NET 5 0 这是一个 Intranet 应用程序 因此我使用 Windows 身份验证 对于授权 我使用 AspNetCore Identity 中的自定义角色 出于各种原因不想使
  • 在 Java 中复制文件的最快方法

    在 Java 中复制大量文件的最快方法是什么 到目前为止我已经使用了文件流和nio 总体来说流似乎比 nio 更快 到目前为止 你有哪些经历 http www baptiste wicht com 2010 08 file copy in
  • 更改先前提交的作者姓名:快进推送被拒绝

    我最近在 GitHub 上打开了一个存储库 我是 Git 新手 与新人一样 我使用默认名称和电子邮件进行提交 按照最佳菜鸟传统 我发现五次提交为时已晚 现在乐趣开始了 因为我开始搜索有关如何更改这些提交的作者和提交者名称的信息 美好的 我基
  • Xcode 4.6.3 中 Dropbox API 的代码设计失败:“代码对象根本没有签名”

    我有一个通过 Mac App Store 分发的 OS X 应用程序 最近更新到 Xcode 4 6 3 当我现在运行常规构建时 我收到 Command usr bin codesign failed with exit code 1 Us
  • Browserify 的自定义依赖项名称不起作用

    我正在尝试让 browserify 的自定义依赖项名称与内存流一起使用 我使用内存流的原因是因为此代码注定要在 AWS Lambda 内部运行 该 AWS Lambda 将接收多个 文件 作为输入 并且 Lambda 无法通过文件系统使用该
  • 自定义相机预览问题(拉伸)

    我的相机应用程序出现问题 我的应用程序有 1 CameraActivity class和 2 CameraPreview class CameraPreview实施一个surfaceView它是从哪里调用的CameraActivity以进行
  • jenkins:使用 URL 传递多个“扩展选择参数”值

    我的参数之一Jenkins构建是一个扩展选择参数 https wiki jenkins ci org display JENKINS Extended Choice Parameter plugin从构建网页调用构建时 它作为逗号分隔值的选
  • 如何在 Swift Playground 中使用 Carthage 导入的框架

    我有一个快速项目 其中通过迦太基添加了一些框架 是否可以在项目内部的游乐场中使用这些框架以及如何使用它 因为 import Argo 不起作用 这在某个时候停止工作了 叹 我现在做的是 创建 macOS gt 命令行工具 创建一个购物车文件
  • Java 定期挂在 futex 且 IO 输出非常低

    目前我的应用程序周期性地阻塞IO 并且输出非常低 我使用一些命令来跟踪该过程 通过使用jstack我发现该应用程序挂在 FileOutputStream writeBytes 处 通过使用strace f c p pid为了收集系统调用信息
  • 为什么在 Scala 中函数类型需要以单独的参数组传递到函数中

    我是 scala 新手 我用两种方式编写了相同的代码 但我对两种方式有点困惑 在第二种方式中 f 的参数类型是自动派生的 但在 type1 中 scala 编译器无法执行相同的操作 我只是想了解这背后的想法是什么 Type1 给出编译错误
  • PickContact 需要 android.permission.READ_CONTACTS 或 grantUriPermission()

    首先一些信息 我首先在 Cordova 中创建了该应用程序 请参阅Cordova 权限需要 android permission READ CONTACTS 或 grantUriPermission https stackoverflow
  • 如何用java编写组合和聚合

    我想知道如何在java中识别组合和聚合代码 我有C 代码 但我不明白如何用java编写 作品 class A class B A composited A 通过指针聚合 class A class B A pointer to A B A
  • Android:直接截屏到字节 - 跳过保存到文件

    我使用以下代码在 root 设备上截取屏幕截图 sh Runtime getRuntime exec su null null os sh getOutputStream os write system bin screencap p sd
  • 使用 Jasmine 测试服务功能 POST 响应

    我不完全确定如何执行此操作 但我有一个端点 URL 它是用于登录身份验证的 POST 请求 添加请求负载时 您将获得成功的登录凭据或错误 但是 我似乎在获取响应时遇到问题 这是我的spec file describe Service Aut
  • 在 Symfony3 中覆盖 Doctrine2 类型

    我想用Carbon http carbon nesbot com docs 我的 Symfony 3 2 应用程序中的对象而不是 SPL DateTime 对象 我发现了一组 DoctrineExtension 类here https gi
  • systemd 错误“无法启动服务:单元服务未正确加载:exec 格式错误”

    我可以执行准确的ExecStart来自 shell 的命令并且它可以工作 但是由于某种原因在此服务文件中这不起作用 有什么想法吗 error Failed to start previewapi service Unit previewap
  • 使用 Moq 和 EF 4.1 模拟工作单元

    我正在通过 Contoso 示例进行一些 TDD 实践 并且我用于检索学生的测试正在通过 我创建新学生的测试失败了 尽管实际代码有效 因为我相信 DBContext 没有被嘲笑 为了通过这个测试 我应该重构什么 测试失败 如下所示 Cont