如何在具有数据库调用的ASP.net MVC中正确测试控制器

西阿维纳什(Sai avinash)

我正在使用ASP.net MVC 3.0应用程序。我正在MSTest与一起Moq用于单元测试。我已经为控制器编写了所有测试方法,并运行了这些测试,从而获得了成功的结果。

现在,我怀疑我是否已经正确进行了单元测试。因为,几乎我的大多数控制器操作都包含数据库调用。

我不是在嘲笑他们,我只是在嘲笑SessionRequest使用Moq对象。

因为单元测试意味着测试单个代码单元,所以真的有必要模拟数据库调用吗?我认为带有数据库调用的单元测试控制器违反了上面的声明。

如果是这样,任何人都可以向我解释如何模拟数据库调用吗?我没有使用任何实体框架。

更新2:

[httppost]
  public void AjaxSave(Model m)
{
   m.update(); // Database call
}
谢尔盖·别列佐夫斯基(Sergey Berezovskiy)

您应该提取使数据库调用成为单独对象的代码(请参阅“单一职责原理”)。例如,您有控制器

public class PersonController : Controller
{
     public ActionResult Index()
     { 
         var connectionString = 
             ConfigurationManager.ConnectionStrings["foo"].ConnectionString;
         using(var connection = new SqlConnection(connectionString))
         {
             string sql = "SELECT Name FROM People";
             var command = connection.CreateCommand(sql);
             var reader = command.ExecuteReader();
             List<Person> people = new List<Person>();
             while(reader.Read())
             {
                 Person p = new Person();
                 p.Name = reader["Name"].ToString();
                 people.Add(p);
             }

             return View(people);
         }
     }
}

将数据访问代码提取到单独的类(通常称为存储库的)中:

public class PersonRepository : IPersonRepository
{
     public List<Person> GetAllPeople()
     {
         var connectionString = 
             ConfigurationManager.ConnectionStrings["foo"].ConnectionString;
         using(var connection = new SqlConnection(connectionString))
         {
             string sql = "SELECT Name FROM People";
             var command = connection.CreateCommand(sql);
             var reader = command.ExecuteReader();
             List<Person> people = new List<Person>();
             while(reader.Read())
             {
                 Person p = new Person();
                 p.Name = reader["Name"].ToString();
                 people.Add(p);
             }

             return people;
         }
     }
}

您已经注意到,我声明了抽象,它是由数据访问类实现的:

public interface IPersonRepository
{
    List<Person> GetAllPeople();
    // other data access API will go here
}

使控制器依赖于此抽象(这很重要-抽象很容易模拟):

public class PersonController : Controller
{
     private IPersonRepository _personRepository;

     public PersonController(IPersonRepository personRepository)
     {
         _personRepository = personRepository;
     }

     public ActionResult Index()
     { 
         var people = _personRepository.GetAllPeople();
         return View(people);             
     }
}

然后将存储库实现注入到控制器中(.NET中的依赖注入),并对其进行模拟以进行测试:

var repositoryMock = new Mock<IPersonRepository>();
var people = new List<People>(); // provide some sample list 
repositoryMock.Setup(r => r.GetAllPeople()).Return(people);
var controller = new PersonController(repositoryMock.Object);

var result = (ViewResult)controller.Index();
// Assert here
Assert.AreEqual(result.ViewName, "Index");
Assert.AreEqual(result.Model, people);
repositoryMock.VerifyAll();

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在具有数据库调用的ASP.net MVC中正确测试控制器

来自分类Dev

从 JavaScript 正确调用控制器 - ASP.NET MVC

来自分类Dev

没有数据库的ASP.NET MVC

来自分类Dev

ASP.NET MVC5:对具有会话的控制器进行单元测试

来自分类Dev

如何在使用ASP .NET MVC的方法之间正确共享控制器中的对象?

来自分类Dev

带有构造函数注入的单元测试ASP.NET MVC控制器

来自分类Dev

如何对返回匿名对象的ASP.NET Core MVC控制器进行单元测试?

来自分类Dev

如何使用Moq和Nunit测试ASP.Net MVC POST控制器

来自分类Dev

如何对返回匿名对象的ASP.NET Core MVC控制器进行单元测试?

来自分类Dev

ASP.NET MVC控制器无法正确返回带有流内容的HttpResponseMessage

来自分类Dev

如何使用ASP.NET MVC通用控制器填充正确的模型

来自分类Dev

C#ASP.NET MVC控制器单元测试

来自分类Dev

使用TryUpdateModel时的asp.net核心MVC控制器单元测试

来自分类Dev

ASP.net Core MVC测试/使控制器返回字符串?

来自分类Dev

C#ASP.NET MVC控制器单元测试

来自分类Dev

ASP.NET MVC控制器未使用ModelView将正确的值传递给PartialView

来自分类Dev

asp.net MVC控制器共享部分视图的正确位置

来自分类Dev

在ASP.NET Core MVC中通过控制器从数据库读取信息

来自分类Dev

从ASP.NET MVC中的现有数据库生成种子代码

来自分类Dev

从ASP.NET MVC中的现有数据库生成种子代码

来自分类Dev

如何正确配置模拟依赖项以使用 Autofac 测试 Web Api (ASP.NET Core) 控制器

来自分类Dev

从Javascript调用ASP.NET MVC 4控制器

来自分类Dev

ASP.NET MVC 调用控制器方法 DevExpress

来自分类Dev

ASP.NET MVC 5.0模型类-如何在模型类中具有属性但不创建数据库字段

来自分类Dev

如何在ASP.NET MVC中使用routeValue参数调用控制器操作

来自分类Dev

如何在ASP.NET MVC中的控制器中调用模型方法

来自分类Dev

如何在现有数据库中创建ASP.Net Identity表?

来自分类Dev

如何在现有数据库中集成ASP.NET身份表

来自分类Dev

ASP.NET MVC 控制器中的持久数据

Related 相关文章

  1. 1

    如何在具有数据库调用的ASP.net MVC中正确测试控制器

  2. 2

    从 JavaScript 正确调用控制器 - ASP.NET MVC

  3. 3

    没有数据库的ASP.NET MVC

  4. 4

    ASP.NET MVC5:对具有会话的控制器进行单元测试

  5. 5

    如何在使用ASP .NET MVC的方法之间正确共享控制器中的对象?

  6. 6

    带有构造函数注入的单元测试ASP.NET MVC控制器

  7. 7

    如何对返回匿名对象的ASP.NET Core MVC控制器进行单元测试?

  8. 8

    如何使用Moq和Nunit测试ASP.Net MVC POST控制器

  9. 9

    如何对返回匿名对象的ASP.NET Core MVC控制器进行单元测试?

  10. 10

    ASP.NET MVC控制器无法正确返回带有流内容的HttpResponseMessage

  11. 11

    如何使用ASP.NET MVC通用控制器填充正确的模型

  12. 12

    C#ASP.NET MVC控制器单元测试

  13. 13

    使用TryUpdateModel时的asp.net核心MVC控制器单元测试

  14. 14

    ASP.net Core MVC测试/使控制器返回字符串?

  15. 15

    C#ASP.NET MVC控制器单元测试

  16. 16

    ASP.NET MVC控制器未使用ModelView将正确的值传递给PartialView

  17. 17

    asp.net MVC控制器共享部分视图的正确位置

  18. 18

    在ASP.NET Core MVC中通过控制器从数据库读取信息

  19. 19

    从ASP.NET MVC中的现有数据库生成种子代码

  20. 20

    从ASP.NET MVC中的现有数据库生成种子代码

  21. 21

    如何正确配置模拟依赖项以使用 Autofac 测试 Web Api (ASP.NET Core) 控制器

  22. 22

    从Javascript调用ASP.NET MVC 4控制器

  23. 23

    ASP.NET MVC 调用控制器方法 DevExpress

  24. 24

    ASP.NET MVC 5.0模型类-如何在模型类中具有属性但不创建数据库字段

  25. 25

    如何在ASP.NET MVC中使用routeValue参数调用控制器操作

  26. 26

    如何在ASP.NET MVC中的控制器中调用模型方法

  27. 27

    如何在现有数据库中创建ASP.Net Identity表?

  28. 28

    如何在现有数据库中集成ASP.NET身份表

  29. 29

    ASP.NET MVC 控制器中的持久数据

热门标签

归档