Вот как я это решил:
Blade - Просмотр
@foreach($course->activeLessons as $lesson)
<article class="lesson" >
{!! $loop->iteration!!}. <a href="{{route('learn.show', $lesson->id)}}"></a>
<div class="body" id="title"> {!! $lesson->title!!}</div>
<p> {!! $lesson->short_description !!}</p>
<div class ="interaction">
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#myCourse" data-myvalue="{{$lesson->title}}" data-myvar="{{$lesson->id}}">
Start lesson
</button>
</div>
</article>
@endforeach
<div class="modal fade" id="myCourse" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title" id="myModalLabel">Modal title</h4>
</div>
<div class="modal-body">
<span id="modal-myvalue"></span>
<span id="modal-myvar"></span>
<span id="modal-bb"></span>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
</div>
</div>
</div>
</div>
В файле Js
var ATTRIBUTES = ['myvalue', 'myvar', 'bb'];
$('[data-toggle="modal"]').on('click', function (e) {
var $target = $(e.target);
var modalSelector = $target.data('target');
ATTRIBUTES.forEach(function (attributeName) {
var $modalAttribute = $(modalSelector + ' #modal-' + attributeName);
var dataValue = $target.data(attributeName);
$modalAttribute.text(dataValue || '');
});
});
Не пашущий слишком глубоко, это выглядит главным образом корректным.
Свойство приложения является виртуальным на HttpContextBase, таким образом, необходимо смочь настроить возвращаемое значение для него от Носорога - Предположение, что Вы дразните HttpContextBase, как сообщение Scott Hanselmanns делает.
Некоторые возможные причины, которые являются действительно просто предположениями от отсутствия информации:
Причина, которую я спрашиваю, состоит в том, что обычно, когда Вы делаете установки ожидания, у Вас уже есть ссылки на объекты, которые назовут как часть Вашего теста, таким образом, Вы не сделали бы, цепочка свойства как Вы делает с Вашим controllerToTest.ControllerContext.HttpContext. Expect()
звонить.
Править:
Я думаю, что вижу проблему, и я думаю, что это с этой частью:
Expect(ctx => ctx.Application[Globals.GlobalsKey])
Я думаю, что Вы предполагаете, что индексаторы работают то же свойствами, когда они не делают. То, что действительно необходимо сделать, настраивается ожидание по Вашему appState
объект принять вызов к свойству Item, как это:
// setup expectations -- assumes some of the expectations and mocks
// the from original question
mockHttpBase.Expect(ctx => ctx.Application).Return(appState);
appState.Expect(ctx => ctx.Item(Globals.GlobalsKey)).Return(tmpAppGlobals);
// run the test
вы можете использовать нижеприведенное для Moq. Мне потребовалось некоторое время, чтобы издеваться над HttpApplication, а appState.Object - это метод возврата, черт возьми!
public static HttpContextBase FakeHttpContext()
{
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
var response = new Mock<HttpResponseBase>();
var session = new FakeHttpSessionState();
var server = new Mock<HttpServerUtilityBase>();
var appState = new Mock<HttpApplicationStateBase>();
context.Setup(ctx => ctx.Request).Returns(request.Object);
context.Setup(ctx => ctx.Response).Returns(response.Object);
context.Setup(ctx => ctx.Session).Returns(session);
context.Setup(ctx => ctx.Server).Returns(server.Object);
context.Setup(ctx => ctx.Application).Returns(appState.Object);
//emulate session (HttpContext.Current.Session)
var contx = new HttpContext(new MyApp.NUnit.Tests.Fakes.FakeHttpWorkerRequest());
contx.Items["AspSession"] = CreateSession();
HttpContext.Current = contx;
return context.Object;
}