2013-04-22 2 views
1

Мое веб-приложение использует аутентификацию PKI через PIV-карту. Я получаю уникальную информацию об идентификаторе пользователя через HttpClientCertificate.Subject. Проблема в том, что когда я выполняю модульное тестирование, mock не будет издеваться над этим классом, поскольку он не имеет конструктора. Я попытался следующие советы по этой теме:ASP.NET MVC 4 Unit Test - есть способ высмеять HttpClientCertificate с помощью Moq

How to mock HttpClientCertificate?

, но это выглядит как то, как он устанавливает его должен вводить сертификат клиента через конструктор контроллера, который я «не хочу сделать, так как контроллер уже имеет доступ к сертификату клиента. Я предполагаю, что он подразумевает, так как он использует какой-то тип адаптера. Кто-нибудь получил лучшее предложение?

ответ

1

Почему бы вам не обернуть его в свой собственный объект?

class MyHttpClientCertificate 
{ 
    public MyHttpClientCertificate(HttpClientCertificate foo) { ... } 

    internal MyHttpClientCertificate() { ... } 
} 
+0

Это потребовало бы мне, чтобы ввести сертификат клиента в мой контроллер, который я не хочу делать поскольку контроллер уже имеет к нему доступ. – RiceRiceBaby

+0

просто переопределить свойство, которое имеет контроллер с 'new' –

0

Ваш вопрос о том, что код использует объект запроса, чтобы получить сертификат, но это не так легко проверяемые блок.

Что я хотел бы сделать, это добавить делегат функции, который по умолчанию будет использовать объект Request для возврата HttpClientCertificate, но позволит переопределить реализацию.

Для контроллера, добавьте это:

internal Func<HttpClientCertificate> HttpClientCertificateGetter =() => { 
    return Request.ClientCertificate; 
} 

А в вашем контроллере вместо использования запроса использовать HttpClientCertificateGetter.

Затем в тестовом модуле вы издеваться сертификат и назначить его функции геттера, например:

var certMock = new Mock<HttpClientCertificate>(); 
HttpClientCertificate clientCertificate = certMock.Object; 
requestMock.Setup(b => b.ClientCertificate).Returns(clientCertificate); 
certMock.Setup(b => b.Certificate).Returns(new Byte[] { }); 

controller.HttpClientCertificateGetter =() => {certMock.Object}; 
+1

Я пробовал ваш подход, но не могу заставить его работать. По-видимому, вы не можете использовать moq, чтобы высмеивать httpclientcertificate, потому что класс не имеет конструктора. – RiceRiceBaby

Смежные вопросы