如何模拟和测试asp.net身份的UserStore.CreateAsync方法

时间:2015-02-20 20:00:52

标签: asp.net-mvc

我有一个相当简单的问题。我只是试图测试asp.net Identity的UserStore方法,并在我的测试中使用它。本质上,目标只是创建一个模拟用户存储(在内存中),插入一个虚拟用户并验证插入是否成功。

[Test]
public void Can_Create_User()
{
    var identityResult = Task.FromResult(new IdentityResult());
    var user = new ApplicationUser() { UserName = "Andy", Email = "andy@andy.com" };
    var store = new Mock<UserStore<ApplicationUser>>();
    store.Setup(x => x.CreateAsync(user))
            .Returns(identityResult);


    Assert.IsTrue(identityResult.Result.Succeeded);
}

但是测试仍然失败,预期是真的&#39;错误。

谢谢

2 个答案:

答案 0 :(得分:2)

我正在回答我自己的问题,因为某些原因问题没有得到任何意见,我确实设法解决了这个问题。

我不知道这是否是正确的方法,但我修复它的方法是首先将successfulResult更改为Task<IdentityResult>并将IdentityResult.Success分配给它

[Test]
    public void Can_Create_User()
    {
        Task<IdentityResult> successfulResult = Task.FromResult<IdentityResult>(IdentityResult.Success);
        var user = new ApplicationUser() { UserName = "Andy", Email = "andy@andy.com" };
        var store = new Mock<UserStore<ApplicationUser>>();
        store.Setup(x => x.CreateAsync(user)).Returns(successfulResult);
        Task<IdentityResult> tt = (Task<IdentityResult>) store.Object.CreateAsync(user);
        Assert.IsTrue(tt.Result.Succeeded);

}

答案 1 :(得分:0)

我没有看到您尝试测试的代码,但据我所知,问题是如何模拟返回IdentityResult的方法?

默认情况下,您无法创建IdentityResult的新实例并为Successed属性赋值,因为它不访问SET,它只接受GET。

无论如何, IdentityResult 受保护的构造函数,它接受bool,表示是成功是真还是假。这意味着您可以创建自己继承IdentityResult 的IdentityResultMock类,而不是控制创建赋值成功。

您可以看到我回答here的示例。

请参阅我的