【发布时间】:2016-06-15 02:30:44
【问题描述】:
我想编写一个单元测试来测试是否创建了一个新项目,而不是将它实际保存到数据库中。我对起订量不是很熟悉,也不是一般的嘲笑。
这是控制器代码:
// POST: api/MoviesAPI
[ResponseType(typeof(MovieDTO))]
[Route("api/movies/post")]
public IHttpActionResult PostMovies(MovieDTO movie)
{
// Validation
if (String.IsNullOrWhiteSpace(movie.Title))
{
return Ok("Movie Title is required");
}
if (movie.GenreIds == null || movie.GenreIds.Count == 0)
{
return Ok("A new Movie requires at least one genre to be selected");
}
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
// /Validation
//// Create Movie type object to add
var newMovie = new Movies()
{
Title = movie.Title,
Released = movie.Released
};
using (var db = new MoviesContext())
{
// Link genres from DB to the new Movie
newMovie.Genres = new List<Genres>();
foreach (var g in movie.GenreIds)
{
var genreToAdd = db.Genres.FirstOrDefault(x => x.GenreId == g);
newMovie.Genres.Add(genreToAdd);
}
// Try to insert the new Movie
try
{
db.Movies.Add(newMovie);
db.SaveChanges();
}
catch (DbEntityValidationException ex)
{
return BadRequest(ex.Message);
}
return Ok(movie);
}
}
还有我不完整的测试:
[TestMethod]
public void Insert_NewMovie_IsSuccessful()
{
//var sut = new Mock<MoviesAPIController>();
var sut = new MoviesAPIController();
var model = new MovieDTO();
//sut.PostMovies(model);
// TODO: Assert
}
【问题讨论】:
-
首先,您必须将所有数据库代码移出控制器。将其添加到具有接口的类中,并将其注入到控制器构造函数中。
-
您必须拆分代码层。添加服务层和数据层将允许您使用模拟服务对业务逻辑进行单元测试
标签: c# asp.net-mvc unit-testing nunit moq