2

我是单元测试的初学者。请帮我

我有类UserData UserData.cs

public partial class UserData
{

    /// <summary>
    /// return all not locked users
    /// </summary>
    /// <returns></returns>
    public static List<UserData> GetAllNotLockedUsers()
    {
        using (var db = new VostokPortalEntities())
        {
            var result = db.UserData.Where(i => !i.IsLocked).ToList();
            return result;
        }
        throw new Exception("cannot get users");
    }
}

我有控制器动作

    [HttpGet]
    public ActionResult Index()
    {           
        //get all user list
        var users = UserData.GetAllNotLockedUsers();
        return View(users);
    }

我有测试方法

[TestMethod]
public void UserPageUnAuth()
{
    var fakedHttpContext = TestCore.FakeHttpContext();
    var homeController = new HomeController(fakedHttpContext);
    var indexResult = homeController.Index() as ViewResult;
    Assert.IsNotNull(indexResult);
}

我想使用 Mock 进行测试。我应该怎么办?我应该用存储库模式重写类吗?这是必要的吗?我应该重写控制器逻辑吗?我应该向 EF 自动生成的类添加一些代码 Internet 上是否有关于初学者单元测试的文章?有没有简单的方法来模拟 EF?

4

1 回答 1

1

将 DB 操作移至 Repository 类是一个好主意。您应该从为存储库创建接口开始。

public interface IUserRepository
{
    IEnumerable<User> GetAllNotLockedUsers();
}

然后你应该实现一个非静态存储库类。

public class UserRepository : IUserRepository
{
    public IEnumerable<User> GetAllNotLockedUsers()
    {
        using (var db = new VostokPortalEntities())
        {
            var result = db.UserData.Where(i => !i.IsLocked).ToList();
            return result;
        }
    }
}

由于存储库不再是静态的,因此您必须在使用它之前在某处实例化它。但是,下面的代码将不可测试。

[HttpGet]
public ActionResult Index()
{           
    var repository = new UserRepository();
    return View(repository.GetAllNotLockedUsers());
}

存储库是在函数内部创建的,因此您不能用模拟替换它进行测试。您可以使用构造函数注入来注入此对象。

public class MyController : Controller
{
    private readonly IUserRepository _repository;

    public MyController(IUserRepository repository)
    {
        _repository = repository;
    }
}

现在 MyController 是可测试的,因为您可以注入模拟实例而不是具体实现。

[Test]
public void RepositoryTest()
{
    //using Moq here
    Mock<IUserRepository> repositoryMock = new Mock<IUserRepository>();
    MyController controller = new MyController(repositoryMock.Object);
}

但是,默认控制器工厂将无法在没有无参数构造函数的情况下创建控制器。它对您的存储库实现一无所知。从现在开始,您应该得到 DI 容器的帮助来创建控制器。这个我就不详细说了,大家可以看看这篇博文

于 2012-07-19T13:48:47.413 回答