小编nfp*_*lee的帖子

在测试初始化​​方法中模拟HttpContext.Current

我正在尝试将单元测试添加到我构建的ASP.NET MVC应用程序中.在我的单元测试中,我使用以下代码:

[TestMethod]
public void IndexAction_Should_Return_View() {
    var controller = new MembershipController();
    controller.SetFakeControllerContext("TestUser");

    ...
}
Run Code Online (Sandbox Code Playgroud)

使用以下帮助程序来模拟控制器上下文:

public static class FakeControllerContext {
    public static HttpContextBase FakeHttpContext(string username) {
        var context = new Mock<HttpContextBase>();

        context.SetupGet(ctx => ctx.Request.IsAuthenticated).Returns(!string.IsNullOrEmpty(username));

        if (!string.IsNullOrEmpty(username))
            context.SetupGet(ctx => ctx.User.Identity).Returns(FakeIdentity.CreateIdentity(username));

        return context.Object;
    }

    public static void SetFakeControllerContext(this Controller controller, string username = null) {
        var httpContext = FakeHttpContext(username);
        var context = new ControllerContext(new RequestContext(httpContext, new RouteData()), controller);
        controller.ControllerContext = context;
    }
}
Run Code Online (Sandbox Code Playgroud)

此测试类继承自具有以下内容的基类:

[TestInitialize]
public void Init() {
    ...
} …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing mocking httpcontext

171
推荐指数
4
解决办法
12万
查看次数

RequireJs - 定义与需求

对于模块,我不返回我一直使用的对象而不是define.例如,假设我有以下jQuery插件(jquery.my-plugin.js):

require(['jquery'], function($) {
    $.fn.myPlugin = function(options) {
        ...
    };
});
Run Code Online (Sandbox Code Playgroud)

现在如果我在另一个模块中说出以下内容:

require(['jquery', 'jquery.my-plugin'], function($) {
    $('#element').myPlugin();
});
Run Code Online (Sandbox Code Playgroud)

我发现这不起作用,因为myPlugin尚未注册.但是,如果我将require更改为我的jquery.my-plugin模块中的define,那么它可以正常工作.

如果有人能清楚我为什么要这样做,我会很感激.在继续使用它之前,我想完全理解一些东西.谢谢

javascript requirejs

55
推荐指数
2
解决办法
3万
查看次数

在变量中存储Lambda表达式

我认为我的大脑已经变得油腻,因为我正在努力做一些简单的事情.在我的应用程序中,我有以下代码来配置Nhibernate(我的问题不是特定于Nhibernate).

return Fluently.Configure()
    .ExposeConfiguration(c => {
        c.EventListeners.PostInsertEventListeners = new IPostInsertEventListener[] { new LoggingEventListener() };
        c.EventListeners.PostUpdateEventListeners = new IPostUpdateEventListener[] { new LoggingEventListener() };
   });
Run Code Online (Sandbox Code Playgroud)

但是我需要将配置(ExposeConfiguration中的内容)存储在私有变量中.我可以做以下事情:

return Fluently.Configure()
    .ExposeConfiguration(c => _configuration = c);
Run Code Online (Sandbox Code Playgroud)

_configuration是一个私有变量.但这并没有添加我的额外配置选项(EventListeners的东西).我玩各种各样的东西,但我想我的lambda知识不如我想的那么好.

我很感激你的帮助.谢谢

c#

41
推荐指数
1
解决办法
3万
查看次数

为My API实施OAuth 2.0身份验证

我已成功使用Facebook Graph API(使用oauth 2.0进行身份验证)一段时间了.我现在需要编写自己的API,允许开发人员以类似的方式连接到它.我已经调查了各种各样的图书馆,但我想要一些更精简的东西,所以我决定推出自己的图书馆.看看代码我必须在Facebook上验证用户它看起来相对简单,但如果我偏离轨道,请纠正我.

首先,我需要提供一个消费者需要重定向到的安全页面.例如https://api.mydomain.com/oauth/authorize?client_id=CONSUMER_KEY&redirect_url=CALLBACK_URL.用户将验证应用程序,然后我将使用查询字符串中的oauth_token重定向回回调回URL中提供的URL.我想我可以在这里为oauth_token生成一个随机唯一字符串,并将其存储在该特定消费者的用户身上(编辑:请参阅下面的答案,这对于每个消费者应用程序而不是用户应该是唯一的).

这是第1步.我现在需要提供第二个安全页面,消费者会触发Web请求.例如https://api.mydomain.com/oauth/access_token?client_id=CONSUMER_KEY&client_secret=CONSUMER_SECRET&oauth_token=OAUTH_TOKEN_RETURNED_ABOVE.这将允许消费者交换上面返回的oauth_token作为访问令牌.我将再简单地生成一个随机的唯一字符串,并将其存储在针对该特定消费者的用户.

现在我的API将接受access_token用于尝试获取特定于正在使用它的用户的信息的方法.

我想知道我是否理解正确的事情.如果是这样的话,OAuth 2.0规范似乎非常微不足道.为什么我们必须用access_token交换oauth_token?我有自己的想法,但如果有人能帮助澄清这一点,我会很感激.

我非常感谢您的反馈,因为我不希望继续前进,浪费时间实现这一点,当它完全错误时.

谢谢

.net c# oauth-provider oauth-2.0

30
推荐指数
1
解决办法
2万
查看次数

如何在控制器外部访问RequestContext?

背景

我试图将业务逻辑从控制器转移到他们自己的服务中.

调节器

public class AccountController : Controller
{
    private readonly IAccountService _accountService; 

    public AccountController(IAccountService accountService)
    {
        _accountService = accountService;
    }

    ....
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Unity注入依赖项.我想Url.GenerateUrl()在实现中使用helper方法IAccountService但是Url是针对控制器的属性.

我查看了MVC源代码,看看它是如何完成的,但它要求我RequestContext从控制器外部访问,我不知道该怎么做.

如何从控制器外部访问RequestContext?如果这不能解决我的问题,我如何解决我的设置问题?

asp.net-mvc dependency-injection urlhelper requestcontext

19
推荐指数
2
解决办法
2万
查看次数

使用NHibernate进行复合键/ Id映射

我的数据库中有以下表格:

Announcements:
- AnnouncementID (PK)
- Title

AnouncementsRead (composite PK on AnnouncementID and UserID):
- AnnouncementID (PK)
- UserID (PK)
- DateRead

Users:
- UserID (PK)
- UserName
Run Code Online (Sandbox Code Playgroud)

通常我会使用多对多关系映射"AnnouncementsRead",但此表还有一个额外的"DateRead"字段.

到目前为止,我已经定义了以下实体:

    public class Announcement
    {
        public virtual int AnnouncementID { get; set; }
        public virtual string Title { get; set; }
        public virtual IList<AnnouncementRead> AnnouncementsRead { get; private set; }

        public Announcement()
        {
            AnnouncementsRead = new List<AnnouncementRead>();
        }
    }

    public class AnnouncementRead
    {
        public virtual Announcement Announcement { get; set; } …
Run Code Online (Sandbox Code Playgroud)

nhibernate composite-key nhibernate-mapping fluent-nhibernate composite-id

18
推荐指数
1
解决办法
3万
查看次数

创建接口实例

我定义了以下接口:

public interface IAudit {
    DateTime DateCreated { get; set; }
}

public interface IAuditable {
    IAudit Audit { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

IAuditable接口说,这班我将有一个Audit对.该IAudit接口是Audit该类的实际接口.例如,说我有以下实现:

public class User : IAuditable {
    public string UserName { get; set; }
    public UserAudit Audit { get; set; }
}

public class UserAudit : IAudit {
    public string UserName { get; set; }
    public DateTime DateCreated { get; set; }

    public UserAdit(User user) {
        UserName = user.UserName; …
Run Code Online (Sandbox Code Playgroud)

c# interface

17
推荐指数
4
解决办法
6万
查看次数

创建模块的多个实例

我以为我开始很好地理解JavaScript,但显然不是.让我用一个例子来解释我的问题.首先,我定义了以下模块:

var Test = function() {
    var counter = 0;

    function init() {
        alert(counter);
    }

    return {
        counter: counter,
        init: init
    }
};
Run Code Online (Sandbox Code Playgroud)

然后我创建了2个实例:

var test1 = new Test();
var test2 = new Test();
Run Code Online (Sandbox Code Playgroud)

现在我更新计数器变量(因为它是公共的)并做一些警报.到现在为止还挺好.

alert(test1.counter); // Alerts 0
test1.counter = 5;
alert(test2.counter); // Alerts 0
test2.counter = 10;
alert(test1.counter); // Alerts 5
Run Code Online (Sandbox Code Playgroud)

现在终于说出以下内容:

test1.init(); // Alerts 0
test2.init(); // Alerts 0
Run Code Online (Sandbox Code Playgroud)

这是我不明白的一点.为什么这个警报0?我认为第一个警报是5,第二个是10.

如果有人能解释上述内容如何起作用或指出我正确的方向,我将不胜感激.谢谢

javascript module-pattern revealing-module-pattern

15
推荐指数
2
解决办法
7009
查看次数

加载多个版本的jQuery时RequireJs问题

在我的网站上,我使用RequireJs异步加载大多数JavaScript.请参阅以下内容以了解我的RequireJs配置:

require.config({
    paths: {
        'jquery': '//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery'
    },
    shim: {
        'jquery.accordion': {
            deps: ['jquery']
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

假设我在主体中定义了以下代码以异步加载文件:

require(['DisplayAccordion']);
Run Code Online (Sandbox Code Playgroud)

DisplayAccordion.js包含以下内容:

define(['jquery', 'jquery.accordion'], function($) {
    $(function() {
        $('.xyz').accordion();
    });
});
Run Code Online (Sandbox Code Playgroud)

注意:jquery.accordion只是一个jQuery插件,它没有AMD支持,需要定义全局jQuery变量.

这工作正常,但现在说我将我的页面上的脚本引用删除到第三方库.例如:

<script src="//example.com/ThirdParty.js"></script>
Run Code Online (Sandbox Code Playgroud)

第三方库加载它自己的jQuery版本.现在我收到错误:

Object不支持属性或方法'accordion'.

单步执行代码后,我发现它按以下顺序执行:

  1. ThirdParty.js
  2. jquery.min.js - 第三方版本
  3. jquery.min.js - 我的版本
  4. jquery.accordion.js - 其中$指向我的jQuery版本引用
  5. DisplayAccordion.js(回调函数) - 其中$指向jQuery的第三方版本

现在我可以看到为什么我得到错误,因为插件附加到另一个对象.但是我不确定为什么会这样做.

以下信息将简单解释为什么使用$ .noConflict(true)将无效.

经过一番研究后的问题.我将配置修改为:

require.config({
    paths: {
        'jquery': '//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery'
    },
    map: {
        '*': { 'jquery': 'jquery-private' },
        'jquery-private': { 'jquery': 'jquery' }
    },
    shim: {
        'jquery.accordion': {
            deps: ['jquery']
        }
    }
}); …
Run Code Online (Sandbox Code Playgroud)

jquery requirejs

14
推荐指数
1
解决办法
1287
查看次数

如何使用jQuery模板格式化日期/时间?

我刚开始使用jQuery模板作为我的javascript模板引擎.我的问题是,我如何格式化日期(从ASP.NET Json ActionResult返回)格式:

/Date(1288709830000)/
Run Code Online (Sandbox Code Playgroud)

我尝试过以下操作:

{{= $.format(new Date(parseInt(comment.DateCreated.substr(6))), 'd')}} 
Run Code Online (Sandbox Code Playgroud)

注意上面使用新的jquery全球化插件来添加$.format方法.还要注意说{{= comment.DateCreated }}是长话${comment.DateCreated}.

如果你能提供帮助,我真的很感激.

asp.net-mvc jquery jquery-templates

11
推荐指数
1
解决办法
2万
查看次数