gpt4 book ai didi

asp.net-mvc - 具有多层的 MVC4 TDD

转载 作者:行者123 更新时间:2023-12-04 05:27:55 25 4
gpt4 key购买 nike

我正在学习 DI、IoC 和 MOQ,所以我可以 TDD 我的新 MVC4 应用程序。

我在网上关注了很多例子,但有一件事我无法掌握。

我的应用程序由 3 层(物理项目)组成:

  • 应用层( Controller /模型/标准 MVC4 东西)。
  • 业务层(做所有的计算和处理数据)。
  • DAL (EF5)。

  • 现在我有一个非常简单的 UserController
    public class UserController : Controller
    {
    readonly IUserRepository _repository;

    public UserController(IUserRepository rep)
    {
    _repository = rep;
    }

    public ActionResult Index()
    {
    IList<User> users = _repository.Get(10);
    return View(users);
    }

    依赖是用 Unity 注入(inject)的,这很好用。

    在业务层我有存储库:

    public interface IUserRepository
    {
    IList<User> Get(Int32 count);
    }

    public class UserRepository : IUserRepository
    {
    public IList<User> Get(Int32 count)
    {
    // Here I fetch the data from the Database
    // and do some stuff with it, this can be
    // quite a big method.
    }
    }

    现在我需要访问我的 DAL,这可以在我的 UserRepository 中进行。的获取方法。

    只有我如何对此进行单元测试?由于可测试性,我认为类中不应该存在依赖关系。

    如果我使用实际的 UserRepository在我的单元测试中测试它的类将转到 DAL 并使用那里的数据,但我需要模拟数据。

    我需要再做一个 IUserDataRepository从数据库中获取实际数据并将其传递到 UserRepository构造函数还是我应该使用 Unity 为我处理这个问题?

    可能的答案?

    我创建了一个名为 Users 的新界面:

    public class Users: IUsers
    {
    private readonly IUserRepository _userRepository;
    public Users(IUserRepository userRepository)
    {
    _userRepository = userRepository;
    }

    public User Get(String id)
    {
    // Do all the magic here here
    }
    }

    从此界面 IUsers :

    public interface IUsers
    {
    User Get(String id);
    }

    但我将面向数据库的存储库移至 DAL:

    public class UserRepository : IUserRepository
    {
    public User Get(String id)
    {
    // Retrieve the user from the database with EF5
    }
    }

    public interface IUserRepository
    {
    User Get(String id);
    }

    Controller 保持不变,但现在依赖于 IUser 接口(interface):

    public class UserController : Controller
    {
    readonly IUsers _users;

    public UserController(IUsers users)
    {
    _users = users;
    }

    public ActionResult Index()
    {
    User user = _users.Get(10);
    return View(users);
    }
    }

    最佳答案

    存储库是通往数据库的网关。它们包含尽可能少的代码(没有业务内容),并且只做将数据从数据库中取出(或将其保存到数据库中)所需的操作。

    由于它直接耦合到您的数据库,因此您无法对其进行单元测试。当您抽象出该逻辑时,您只能对其进行单元测试,但这正是存储库的用途,因此这是一个无用的抽象。

    相反,为他们编写集成测试以设置数据库事务并调用真实存储库并在完成后回滚该事务。

    关于asp.net-mvc - 具有多层的 MVC4 TDD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12989766/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com