首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CreateUser lite的CreateUser()方法的单元测试

使用CreateUser lite的CreateUser()方法的单元测试
EN

Code Review用户
提问于 2017-06-13 09:50:27
回答 1查看 615关注 0票数 6

我刚开始进行单元测试,并为create用户操作方法创建了一个单元测试,它正在通过测试。我不确定这是否是单元测试创建方法的正确方法。

这是我的测试方法:

代码语言:javascript
复制
[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");
}

这是一种行动方法:

代码语言:javascript
复制
[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);
}

任何相关的控制器信息:

代码语言:javascript
复制
private IUserRepository _UserRepository;
private IStaticMembershipService _membershipService;

public UserController(IUserRepository UserRepo, IStaticMembershipService membershipService)
{
    _UserRepository = UserRepo;
    _membershipService = membershipService;
}

IUserRepository

代码语言:javascript
复制
public interface IUserRepository
{
    List<User> GetAllUsers(int Id);

    OperationStatus AddUser(User newUser);

    User GetUserById(int Id);
}

包含上述接口定义的UserRepository:

代码语言:javascript
复制
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;
}

测试进行得很好。我只是不确定这是否是单元测试的正确方式。如果我走得对,请告诉我。

EN

回答 1

Code Review用户

发布于 2017-06-13 10:19:04

我想你不是在测试所有的东西。API应该创建一个用户,但是您断言的唯一事情是ActionResult

Assert.AreEqual(actionResult.RouteValues“行动”,“索引”);

因此,该方法运行,结果正确。但是,它是否真的创建了一个新用户并将其添加到存储库中?这次行动怎么样?

opStatus = _UserRepository.AddUser(newUser);

IMO还应该检查存储库,以确定API是否正确地向其添加了新用户。我不知道UserRepository可以实现哪些接口

代码语言:javascript
复制
var UserRepository = Mock.Create<IUserRepository>();

像这样的断言可能是适当的(仅仅是例子),或者其他对存储库有意义的东西。

代码语言:javascript
复制
Assert.AreEqual(1, UserRepository.Count);
Assert.AreEqual(referenceUser, UserRepository.GetUser(abc));

如果有人在存储库中遇到问题并将其注释掉,而实际上忘记了添加#if DEBUG或做了任何其他更改,而忽略了状态代码,该怎么办?

代码语言:javascript
复制
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);
}

测试仍将通过,但结果将是错误的。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/165637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档