【问题标题】:write unit testing with mock in repository pattern在存储库模式中使用 mock 编写单元测试
【发布时间】:2017-05-14 10:45:48
【问题描述】:

我有以下接口及其存储库类

界面

public interface IIdentityRepository
{
    bool CreateUser(ApplicationUser user, string password);
}

存储库

public class IdentityRepository : IIdentityRepository
{
    ApplicationDbContext dbContext;

    public IdentityRepository()
    {
        dbContext = new ApplicationDbContext(); // if none supplied
    }

    public bool CreateUser(ApplicationUser user, string password)
    {
        var userManager = new UserManager<ApplicationUser>(
            new UserStore<ApplicationUser>(dbContext));
        var idResult = userManager.Create(user, password);

        return idResult.Succeeded;
    }    
}

public class UserManager : UserManager<ApplicationUser>
{
    public UserManager()
        : base(new UserStore<ApplicationUser>(new ApplicationDbContext()))
    {
    }
}

这是我正在尝试为CreateUser 方法编写的测试类 在这种方法中,我使用AppplicationUser 作为我的模型。

[TestClass]
public class IdentityRepositoryTest
{
    private IdentityRepository _identitityRepo;
    private Mock<IIdentityRepository> _identitityRepository;

    private List<ApplicationUser> _users;


    // initialize the test class
    [TestInitialize]
    public void TestSetup()
    {
        _identitityRepository = new Mock<IIdentityRepository>();
        _users = new List<ApplicationUser>();

        _identitityRepository.Setup(m => m.CreateUser(It.IsAny<ApplicationUser>())).Callback<ApplicationUser>(c => _users.CreateUser(c));

        _identitityRepo = new IdentityRepository();
    }

    #region Users

    // check valid number of user/s(1) existing in current DB
    [TestMethod]
    public void IsValidtNumberofUsersExist()
    {
        // Arrange           
        _users.Add(new ApplicationUser { UserName = "Kez" , Email = "kez@gmail.com" });

        // Act
        var result = _identitityRepo.GetAllUsers();
        Assert.IsNotNull(result);

        // Assert
        var numberOfRecords = result.ToList().Count;
        Assert.AreEqual(1, numberOfRecords);
    }

    #endregion
}

但是在这里我遇到了以下编译时错误

编辑:

一旦我将错误行更改为以下错误就消失了。

_identitityRepository.Setup(m => m.CreateUser(It.IsAny<ApplicationUser>(),"password")).Callba‌​ck<ApplicationUser>(‌​c => _users.Add(c));

但是当我运行这个测试时,我得到了以下错误

结果信息:初始化方法 ProjectName.UnitTest.Common.IdentityRepositoryTest.TestSetup 抛出 例外。 System.ArgumentException:System.ArgumentException:无效 打回来。使用参数(ApplicationUser,String)设置方法 无法调用带参数的回调 (ApplicationUser)..

【问题讨论】:

  • CreateUser(ApplicationUser user, string password) 有 2 个参数,但您只设置了一个参数。此外,您需要审查您的设计。它与实现问题的耦合过于紧密,无法进行测试。在前进的过程中,您会遇到更多的问题。
  • @Nkosi 好的,谢谢我将上面的行更改如下,然后错误消失_identitityRepository.Setup(m =&gt; m.CreateUser(It.IsAny&lt;ApplicationUser&gt;(),"password")).Callback&lt;ApplicationUser&gt;(c =&gt; _users.Add(c)); 以使这个松散耦合我应该在哪里更改测试类或存储库?
  • “松散耦合”是什么意思。该模拟参数不会使其耦合更紧密。它只负责方法签名。
  • @nozzleman Nkosi 说it is too tightly coupled to implementation concerns to be test friendly 在那里,我认为这会使耦合更松散,我应该在哪里更改以减少紧密耦合的情况,是测试类还是存储库?
  • @kez 修复回调 .Callba‌​ck&lt;ApplicationUser,string&gt;(‌​(u,p) =&gt; _users.Add(u));.Callba‌​ck(‌​(ApplicationUser u,string p) =&gt; _users.Add(u));

标签: c# unit-testing mocking asp.net-identity moq


【解决方案1】:
_identitityRepository.Setup(m => m.CreateUser(It.IsAny<ApplicationUser>(),"password"))
    .Callba‌​ck<ApplicationUser>(‌​c => _users.Add(c));

应该是:

_identitityRepository.Setup(m => m.CreateUser(It.IsAny<ApplicationUser>(),"password"))
    .Callba‌​ck<ApplicationUser, string>(‌​(c, s) => _users.Add(c));

https://github.com/Moq/moq4/wiki/Quickstart#callbacks

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-25
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 2020-10-17
    • 1970-01-01
    相关资源
    最近更新 更多