asp.net-mvc – 如何在ASP.net MVC中正确测试具有数据库调用的控制器
发布时间:2020-05-24 04:08:21 所属栏目:asp.Net 来源:互联网
导读:我正在研究ASP.net MVC 3.0应用程序.我正在使用MSTest和Moq进行单元测试.我已经为我的控制器编写了所有测试方法并运行了那些测试,结果很成功. 现在,我怀疑我是否已经正确地进行了单元测试.因为,几乎我的大多数控制器操作都包含数据库调用. 我不嘲笑他们,我只
|
我正在研究ASP.net MVC 3.0应用程序.我正在使用MSTest和Moq进行单元测试.我已经为我的控制器编写了所有测试方法并运行了那些测试,结果很成功. 现在,我怀疑我是否已经正确地进行了单元测试.因为,几乎我的大多数控制器操作都包含数据库调用. 我不嘲笑他们,我只使用Moq模拟Session和Request对象. 是否真的有必要模拟数据库调用,因为单元测试意味着测试单个代码单元?我认为带有数据库调用的单元测试控制器违反了上述声明. 如果是这样,任何人都可以解释我如何模拟数据库调用吗?我没有使用任何实体框架. Updated2: [httppost]
public void AjaxSave(Model m)
{
m.update(); // Database call
}
解决方法您应该提取使数据库调用成为单独对象的代码(请参阅 Single Responsibility Principle).例如.你有控制器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);
}
}
}
将数据访问代码提取到单独的类(通常称为repositories的类): 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);
}
}
然后将存储库实现注入控制器(Dependency Injection in .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(); (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net – 超过了JavaScriptSerializer.MaxJsonLength.处理
- asp-classic – 在ASP Classic应用程序中获取根目录
- asp-classic – 经典的ASP页面是否会运行在Windows 7之后的
- asp.net-mvc – 动态类型的ViewPage
- asp.net – 具有不同按钮类型的Asp按钮
- asp.net-mvc-3 – 关于Razor中嵌套代码块声明的问题
- asp.net – 设置Html.Hiddenfor的值
- asp.net – 当.resx文件更改时,App域重新启动.有什么办法可
- asp.net-mvc – 禁用为特定提交按钮启用不显眼的验证
- asp.net-mvc-routing – 在MVC 6控制器中使用urlhelper生成
推荐文章
站长推荐
- asp.net-mvc – 如何更改ASP.NET MVC中的默认验证
- .net – 在IIS中部署.PDB文件 任何好处?
- asp.net – 使用HttpRequestMessage.Properties传
- asp.net – 有浏览器相当于IE的ClearAuthenticat
- asp.net-mvc – ASP.Net C#Razor显示编码的HTML而
- asp.net – 从Application_BeginRequest()中设置
- asp.net-mvc – 使用AD的ASP.NET MVC表单Auth在本
- mvc-mini-profiler – MVC MiniProfiler与ASP.NE
- asp.net – 如何实时压缩和流量到Response.Outpu
- asp.net-core – 使用IdentityServer4生成访问令
热点阅读
