Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing c#:为此用例编写测试_Unit Testing_C# 3.0_Nunit_Moq - Fatal编程技术网

Unit testing c#:为此用例编写测试

Unit testing c#:为此用例编写测试,unit-testing,c#-3.0,nunit,moq,Unit Testing,C# 3.0,Nunit,Moq,我想检查用户密码是否已更改,编写此测试的最佳方法是什么?我的代码是否因为错误而需要重构 在code password.ResetUserPassword内-我找出哪个用户请求更改密码,如果他们可以更改,并在需要时生成电子邮件。。。是否需要将用户对象传递到此方法?此逻辑由我的控制器(或后端,如果需要)调用 //我正在调用的方法 _passwordService是一种为用户生成新密钥的服务 public void ResetUserPassword(string identifier, st

我想检查用户密码是否已更改,编写此测试的最佳方法是什么?我的代码是否因为错误而需要重构

在code password.ResetUserPassword内-我找出哪个用户请求更改密码,如果他们可以更改,并在需要时生成电子邮件。。。是否需要将
用户
对象传递到此方法?此逻辑由我的控制器(或后端,如果需要)调用

//我正在调用的方法

_
passwordService
是一种为用户生成新密钥的服务

    public void ResetUserPassword(string identifier, string loginid, string passwordreseturl)
    {
        //get user object
        var currentUser = _readOnlySession.All<User>()
            .Where(x => x.Login == loginid)
            .SingleOrDefault(); //any other logic to get user resides here...

        if (currentUser == null)
            throw new UserNotFoundException();

        _passwordService.ResetPassword(currentUser.User, identifier, loginid);

        //persist data
        _updateSession.Update(currentUser.User);

        //send out email with the url as a link inside the email
    }
public void ResetUserPassword(字符串标识符、字符串loginid、字符串密码reseturl)
{
//获取用户对象
var currentUser=\u readOnlySession.All()
.Where(x=>x.Login==loginid)
.SingleOrDefault();//获取用户驻留在此处的任何其他逻辑。。。
if(currentUser==null)
抛出新的UserNotFoundException();
_passwordService.ResetPassword(currentUser.User、identifier、loginid);
//持久化数据
_updateSession.Update(currentUser.User);
//将url作为电子邮件中的链接发送电子邮件
}

类似于以下内容的操作将起作用。(我不得不对您的类做一些假设,但我仍然不确定currentUser.User是什么类型。)

模拟和解耦的诀窍是使所有的服务依赖项都成为接口

邮件发送需要另一个接口依赖项(带有相关的模拟和验证)。您可能希望将所有这些放在单独的测试夹具中,在设置中进行安排,然后在单独的测试方法中验证每个服务调用

对我来说,这种方法做得太多了——它有多重责任。痛苦的测试设置和多次验证都是代码气味。考虑把它分解成更小的方法(可能仍然是从现有方法中调用),然后独立地测试这些方法。code>GetUser(loginId)(或throw)将是我提取的第一个方法。将其中一些方法移动到服务(如存储库)上会使测试更容易

澄清-您在评论中提到要检查密码密钥是否不同。这是具体的
UserPasswordService
的责任。你需要独立测试

// Arrange

const string TestLogin = "jon.smithers";
User testUser = new User { Login = TestLogin };
var testUsers = new List<User> { testUser };

var mockUpdate = new Mock<IUpdateSession>();

var mockRepo = new Mock<IReadOnlySession>();
mockRepo.Setup(x => x.All<User>()).Returns(testUsers);

var mockPasswordService = new Mock<IUserPasswordService>();

var password = new AccountProfileProcessor(
    mockRepo.Object, mockUpdate.Object, mockPasswordService.Object);

// Act

password.ResetUserPassword("companyid", TestLogin, null);

// Assert

mockPasswordService.Verify(
    x => x.ResetPassword(
        It.IsAny<string>(), It.IsAny<string>(), TestLogin));

mockUpdate.Verify(x => x.Update(testUser));
//排列
const string TestLogin=“jon.smithers”;
用户testUser=新用户{Login=TestLogin};
var testUsers=新列表{testUser};
var mockUpdate=new Mock();
var mockRepo=new Mock();
mockRepo.Setup(x=>x.All()).Returns(testUsers);
var mockPasswordService=new Mock();
var password=新的AccountProfileProcessor(
对象,mockUpdate.Object,mockPasswordService.Object);
//表演
password.ResetUserPassword(“companyid”,TestLogin,null);
//断言
mockPasswordService.Verify(
x=>x.ResetPassword(
It.IsAny(),It.IsAny(),TestLogin));
验证(x=>x.Update(testUser));

如何请求当前密码?我的意思是在更改之前和之后?基本上,我希望获得用户配置文件检查凭据,打电话,然后检查数据是否已更改。这是有效的测试吗?我需要重构这个吗?有两个问题:我的单元测试有效吗?如果不是,是因为我的代码需要重构……它似乎有效,但我需要更多有关
检查数据是否已更改的详细信息,如何执行?如何检查新密码的值?@sll-lol,这就是我遇到的问题,基本上是一个记录(密码密钥)它与原始密钥是否不同,这是我的全部测试。我相信你可以插入模拟密码服务并截获
ResetPassword()
调用参数,但我不确定这是否足够,我不熟悉您的类logiccurrentUser是一个用户(LinqToSql)对象,数据库调用的问题是,您无法真正提取它们,注释类型很难使用,在上面的这个场景中,我删除了其他表(用户配置文件和公司)上的各种连接,我想我从您那里听到的是我决定做的事情,单独测试每项服务,是的,我有通过接口调用的EmailService。我的要求是-更改密码,然后发送电子邮件。我将尽可能地简化我的所有服务——这是我不想使之复杂化的一件事,它也更容易测试。我建议不要从您的存储库中公开IQueryable。对此存在一些争论;这里有一篇文章符合我的观点:如果我不公开IQueryable,那么我就没有机会进行所有复杂的连接,这意味着我必须建立各种存储库才能让我的东西正常工作。我宁愿按照我的意愿给我的db打电话,当我愿意的时候,所有的参数都不一样,有时我需要一些东西来表达我的观点,有时我不需要,否则我就被绑在一件笔直的夹克上,相信我。:)
// Arrange

const string TestLogin = "jon.smithers";
User testUser = new User { Login = TestLogin };
var testUsers = new List<User> { testUser };

var mockUpdate = new Mock<IUpdateSession>();

var mockRepo = new Mock<IReadOnlySession>();
mockRepo.Setup(x => x.All<User>()).Returns(testUsers);

var mockPasswordService = new Mock<IUserPasswordService>();

var password = new AccountProfileProcessor(
    mockRepo.Object, mockUpdate.Object, mockPasswordService.Object);

// Act

password.ResetUserPassword("companyid", TestLogin, null);

// Assert

mockPasswordService.Verify(
    x => x.ResetPassword(
        It.IsAny<string>(), It.IsAny<string>(), TestLogin));

mockUpdate.Verify(x => x.Update(testUser));