我刚开始进行单元测试,并为create用户操作方法创建了一个单元测试,它正在通过测试。我不确定这是否是单元测试创建方法的正确方法。
这是我的测试方法:
[TestMethod]
public void Create_User()
{
Mapper.CreateMap<UserViewModel, User>();
//Arrange
var membershipRepository = Mock.Create<IStaticMembershipService>();
var userMock = Mock.Create<MembershipUser>();
Mock.Arrange(() => userMock.ProviderUserKey).Returns(1);
Mock.Arrange(() => membershipRepository.GetUser()).Returns(userMock);
var UserRepository = Mock.Create<IUserRepository>();
MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
writer.Write("Creating Streams for Testing");
writer.Flush();
stream.Position = 0;
var mockFile = Mock.Create<HttpPostedFileBase>();
Mock.Arrange(() => mockFile.ContentType).Returns("application/pdf");
Mock.Arrange(() => mockFile.FileName).Returns("Test.pdf");
Mock.Arrange(() => mockFile.InputStream).Returns(stream);
Mock.Arrange(() => mockFile.ContentLength).Returns(1);
UserViewModel mockUserViewModel = new UserViewModel { Description = "TestDesc", Title = "Tester", UserId = 1, File = mockFile };
Mock.Arrange(() => UserRepository.AddUser(Arg.IsAny<User>())).Returns(new OperationStatus{Status = true});
//Act
UserController controller = new UserController(UserRepository, membershipRepository);
RedirectToRouteResult actionResult = (RedirectToRouteResult)controller.Create(mockUserViewModel);
//Assert
Assert.AreEqual(actionResult.RouteValues["Action"], "Index");
}这是一种行动方法:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(UserViewModel item)
{
if (ModelState.IsValid)
{
var newUser = Mapper.Map<UserViewModel, User>(item);
//Populates file name and content type to newUser
UserHelper.PopulateFile(item.File, newUser);
newUser.UserId = (int)_membershipService.GetUser().ProviderUserKey;
var opStatus = _UserRepository.AddUser(newUser);
if (!opStatus.Status)
throw new System.Web.Http.HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError));
return RedirectToAction("Index");
}
else
return View(item);
}任何相关的控制器信息:
private IUserRepository _UserRepository;
private IStaticMembershipService _membershipService;
public UserController(IUserRepository UserRepo, IStaticMembershipService membershipService)
{
_UserRepository = UserRepo;
_membershipService = membershipService;
}IUserRepository:
public interface IUserRepository
{
List<User> GetAllUsers(int Id);
OperationStatus AddUser(User newUser);
User GetUserById(int Id);
}包含上述接口定义的UserRepository:
public List<User> GetAllUsers(int Id)
{
using (DataContext)
{
return DataContext.Users.Where(j => j.Id == Id).ToList();
}
}
public Journal GetUserById(int Id)
{
using (DataContext)
return DataContext.Users.SingleOrDefault(j => j.UserId == Id);
}
public OperationStatus AddUser(Journal newUser)
{
var opStatus = new OperationStatus { Status = true };
try
{
using (DataContext)
{
newUser.ModifiedDate = DateTime.Now;
var j = DataContext.Users.Add(newUser);
DataContext.SaveChanges();
}
}
catch (Exception e)
{
//opStatus = OperationStatus.CreateFromException("Error adding user: ", e);
}
return opStatus;
}测试进行得很好。我只是不确定这是否是单元测试的正确方式。如果我走得对,请告诉我。
发布于 2017-06-13 10:19:04
我想你不是在测试所有的东西。API应该创建一个用户,但是您断言的唯一事情是ActionResult。
Assert.AreEqual(actionResult.RouteValues“行动”,“索引”);
因此,该方法运行,结果正确。但是,它是否真的创建了一个新用户并将其添加到存储库中?这次行动怎么样?
opStatus = _UserRepository.AddUser(newUser);
IMO还应该检查存储库,以确定API是否正确地向其添加了新用户。我不知道UserRepository可以实现哪些接口
var UserRepository = Mock.Create<IUserRepository>();像这样的断言可能是适当的(仅仅是例子),或者其他对存储库有意义的东西。
Assert.AreEqual(1, UserRepository.Count);
Assert.AreEqual(referenceUser, UserRepository.GetUser(abc));如果有人在存储库中遇到问题并将其注释掉,而实际上忘记了添加#if DEBUG或做了任何其他更改,而忽略了状态代码,该怎么办?
public ActionResult Create(UserViewModel item)
{
if (ModelState.IsValid)
{
var newUser = Mapper.Map<UserViewModel, User>(item);
//Populates file name and content type to newUser
UserHelper.PopulateFile(item.File, newUser);
newUser.UserId = (int)_membershipService.GetUser().ProviderUserKey;
// I temporarily disabled the repository because I didn't work for me.
//var opStatus = _UserRepository.AddUser(newUser);
//if (!opStatus.Status)
// throw new System.Web.Http.HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError));
return RedirectToAction("Index");
}
else
return View(item);
}测试仍将通过,但结果将是错误的。
https://codereview.stackexchange.com/questions/165637
复制相似问题