class OrderPaidCheckJob < ApplicationJob
queue_as :default
def perform(order_id)
order = Order.find(order_id)
return if order.nil? || order.paid
if order.updated_at > 10.minutes.ago # order recently changed
OrderPaidCheckJob.set(wait: 10.minutes).perform_later(order.id)
return # end this job. check again 10min later
end
order.products.each do |x|
x.ordinable = true
x.save
end
order.destroy
end
end
Я нашел самым удобным создать доступный класс, который обрабатывает установку и сброс Потока. CurrentPrincipal.
public class TemporaryPrincipal : IDisposable {
private readonly IPrincipal _cache;
public TemporaryPrincipal(IPrincipal tempPrincipal) {
_cache = Thread.CurrentPrincipal;
Thread.CurrentPrincipal = tempPrincipal;
}
public void Dispose() {
Thread.CurrentPrincipal = _cache;
}
}
В методе тестирования Вы просто переносите свой вызов с оператором использования как это:
using (new TemporaryPrincipal(new AnonymousUserPrincipal())) {
ClassUnderTest.MethodUnderTest();
}
Для Вашего кода на самом деле нужен пользователь, зарегистрированный на пути ASP.NET, или ему просто нужен CurrentPrincipal? Я не думаю, что необходимо программно войти в систему сайта. Можно создать GenericPrincipal, установить свойства, в которых Вы нуждаетесь и присоединяете его к, например, Поток. CurrentPrincipal или дразнивший HttpContext. Если бы для Вашего кода на самом деле нужны RolePrincipal или что-то затем, что я изменил бы код, который будет менее связан с членством ASP.NET.
Используя Вашего Поставщика Членства можно проверить пользователя, использующего Членство. ValidateUser. Затем можно установить использование cookie аутентификации FormsAuthentication. SetAuthCookie. Пока у Вас есть контейнер cookie, это должно позволить Вам входить в систему пользователь.
if(Membership.ValidateUser("user1",P@ssw0rd))
{
FormsAuthentication.SetAuthCookie("user1",true);
}