Я реализую oauth-провайдера, используя CTP-библиотеку DotNetOpenAuth. Итак, я создал приложение mvc3, в котором есть контроллер OAuth с тремя методами для авторизации сторонних приложений. Контроллер имеет IOAuthService, который инкапсулирует всю логику, которую должна выполнять библиотека для выполнения определенных задач, однако методы службы возвращают объекты DotNetOpenOAuth, защищенные конструкторами которых они являются.
Я хотел бы проверить поведение методов в моем OAuthController, для этого я пытаюсь смоделировать свои методы обслуживания, но я не смог этого сделать. Я должен сообщить библиотеке moq, какой тип объекта я ожидаю, что метод сервиса вернется, и, поскольку я не могу получить доступ к конструкторам этих объектов, я не могу выполнить тест по методу контроллера.
Контроллер:
public class OAuthController : Controller
{
private readonly IOAuthService _oAuthService;
public OAuthController(IOAuthService oAuthService)
{
_oAuthService = oAuthService;
}
[Authorize, AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]
public ActionResult Authorize()
{
ClientApplication requestingClient;
var request = _oAuthService.ReadAuthorizationRequest();
if (request == null)
{
throw new HttpException((int)HttpStatusCode.BadRequest, "Missing authorization request.");
}
var response = _oAuthService.RequestClientAuthorization(GetIdentity().Name, out requestingClient, request);
if (response != null)
{
return response.AsActionResult();
}
var model = new AuthorizeClientApplicationViewModel
{
ClientApplication = requestingClient.Name,
Scope = request.Scope,
AuthorizationRequest = request,
};
return View(model);
}
public virtual IIdentity GetIdentity()
{
return User.Identity;
}
}
Я хочу проверить, что всякий раз, когда стороннее приложение не имеет авторизации, пользователю будет отображаться представление, запрашивающее его разрешение на авторизацию приложения. Для этого мне нужно издеваться:
- _oAuthService.RequestClientAuthorization
Настройка моего метода тестирования будет выглядеть следующим образом:
var oAuthService = new Mock<IOAuthService>();
oAuthService.Setup(a => a.RequestClientAuthorization(userName, out client, pendingRequest)).Returns(new OutgoingWebResponse()); // DotNetOpenAuth doesn't allow me to do the **new OutgoingWebResponse**
PD: Для этого вопроса я написал только один из методов контроллера, но есть 3, и у них есть похожие сценарии.