首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟UserPrincipal

模拟UserPrincipal
EN

Stack Overflow用户
提问于 2011-08-22 16:43:42
回答 4查看 7.5K关注 0票数 8

我有一个处理exchange邮箱的密码更改和过期检查的类。我在UserPrincipal上检查LastPasswordSet。

那么TDD呢?

我想通过编写一些测试来检查我的类是否正确地处理了密码检查。但是我想不通我怎么能模仿UserPrincipal.FindByIdentity(principalContext,的用户名)。

我将要编写一个方法,如果密码在过去90天内被更改,则返回true/false。所以我想模拟UserPrincipal,这样我就可以在我的测试中设置LastPasswordSet返回值,只是为了检查我即将为“密码需要更改通知”编写的逻辑。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-22 18:22:40

我会用一个简洁的短语来回答这个问题

“不要嘲笑你不拥有的类型”

找不到权威的博文来支持这一点。Sample link。尽管这似乎归因于乔·沃尔恩斯。

如果我没记错的话,UserPrincipal是一个与身份验证相关的.Net框架类。模拟您无法控制的类型(可以更改)可能会导致脆弱的测试。

相反,发现您的设计需要从UserPrincipal获得什么

  • 通过在单元测试中模拟clients
  • 来间接查找UserPrincipal履行或实现的角色,并测试所有调用者。
  • 具有“集成测试”,可确保您的实际实现在调用时按下UserPrincipal上的正确按钮。
  • 依靠端到端/验收测试来查找所有组件串联在一起时发生的错误。
票数 4
EN

Stack Overflow用户

发布于 2012-12-21 03:49:15

我意识到这是一个老帖子,但最近我遇到了与原始海报相同的问题,在读完答案后,我想我也会做同样的事情。我不想让别人读到这篇文章,像我一样浪费宝贵的时间,所以我决定真正回复这篇文章。

在意识到没有简单的方法来包装UserPrincipal功能,也没有像建议的那样依赖于集成或端到端测试之后,我想起了有一种方法可以模拟静态类。话虽如此,下面就是如何使用Telerik JustMock来做这件事。

代码语言:javascript
复制
private void MockUserPrincipal()
    {
        //Mock principal context
        var context = Mock.Create<PrincipalContext>((action) => action.MockConstructor());

        //Mock user principal
        var user = Mock.Create(() => new UserPrincipal(context));           

        //Mock the properties you need
        Mock.Arrange(() => user.Enabled).Returns(true);
        Mock.Arrange(() => user.UserPrincipalName).Returns("TestUser");
        Mock.Arrange(() => user.LastPasswordSet).Returns(DateTime.Now);

        //Mock any functions you need
        Mock.Arrange(() => user.IsAccountLockedOut()).Returns(false);

        //Setup static UserPrincipal class
        Mock.SetupStatic<UserPrincipal>();

        //Mock the static function you need
        Mock.Arrange(() => UserPrincipal.FindByIdentity(Arg.IsAny<PrincipalContext>(), Arg.AnyString)).Returns(user);  

        //Now calling UserPrincipal.FindByIdentity with any context and identity will return the mocked UserPrincipal
    }
票数 11
EN

Stack Overflow用户

发布于 2015-06-03 20:56:42

老帖子,但有一个有效的例子。即使你永远不应该测试别人的代码,你也要测试自己的方法。而且您的方法可能需要来自另一个方法返回的UserPrincipal的数据。现在假设您需要检查LastPasswordSet属性。

  1. 右键单击单元测试项目中的.dll System.DirectoryServices.AccountManagement。选择"Add Fakes Assembly“。
  2. 添加此单元测试

新的公共异步任务ActiveDirectoryUserFactory_CreateUserAsyncAndWhatYouExpect() { //安排使用(ShimsContext.Create () ){ var userPrincipal = TestMethod var => = new System.DirectoryServices.AccountManagement.Fakes.ShimAuthenticablePrincipal(userPrincipal);baseUserPrincipal =()=> DateTime.Now;//锁定返回的UserPrincipal以使用我们的userPrincipal,这里是Moq _class.Setup(x => x.GetUserAsync("param")) .Returns(Task.FromResult( UserPrincipal ));// Act,您从_target类中的shimUserPrincipal获取_class.GetUserAsync的方法(我知道您是从外部源获取UserPrincipal) var user = await _target.YourMethod();// Assert Assert.IsNull(user);}} //执行要测试的公共异步任务的代码的方法YourMethod() { var user = await _class.GetUserAsync("param");var lastLogin = user.LastPasswordSet;return new Object() }

有很多关于垫片的资源,所以我就让它这样。希望这能帮助那些在谷歌上搜索"mock UserPrincipal“的人。

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

https://stackoverflow.com/questions/7144959

复制
相关文章

相似问题

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