Модульный тест для метода расширения с использованием moq - PullRequest
1 голос
/ 17 марта 2019

У меня есть два метода расширения, как показано ниже,

public static string FindFirstValue(this ClaimsPrincipal principal, string claimType, bool throwIfNotFound = false)
{
    string value = principal.FindFirst(claimType)?.Value;
    if (throwIfNotFound && string.IsNullOrWhiteSpace(value))
    {
        throw new InvalidOperationException(
            string.Format(CultureInfo.InvariantCulture, "The supplied principal does not contain a claim of type {0}", claimType));
    }

    return value;
}

public static string GetObjectIdentifierValue(this ClaimsPrincipal principal, bool throwIfNotFound = true)
{
    return principal.FindFirstValue("http://schemas.microsoft.com/identity/claims/objectidentifier", throwIfNotFound);
}

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

Может ли кто-нибудь указать мне правильное направление?

Ответы [ 2 ]

2 голосов
/ 17 марта 2019

Я слышал, что невозможно выполнить модульное тестирование методов расширения, поскольку они являются статическими.

Это обычно не true.Если статический метод не не полагается на создание зависимостей, которые он имеет внутри своего тела , и для конкретного ввода получает конкретный вывод, то вы определенно можете проверить его модульно.

В вашем случае вы можете избежать использования Moq для модульного тестирования этих методов расширения.Вы можете создать экземпляры ClaimsPrincipal и протестировать методы расширения, используя эти экземпляры.Ниже вы найдете несколько примеров:

[Test]
public void WhenClaimTypeIsMissingAndAvoidExceptions_FindFirstValue_Returns_Null()
{
    var principal = new ClaimsPrincipal();

    var value = principal.FindFirstValue("claim type value");

    Assert.IsNull(value);
}

[Test]
public void WhenClaimTypeIsMissingAndThrowExceptions_FindFirstValue_ThrowsException()
{
    var principal = new ClaimsPrincipal();

    var claimType = "claim type value";

    Assert.Throws(Is.TypeOf<InvalidOperationException>()
                    .And.Message.EqualTo($"The supplied principal does not contain a claim of type {claimType}")
                , () => principal.FindFirstValue(claimType, throwIfNotFound: true));
}

[Test]
public void WhenClaimTypeIsFound_FindFirstValue_ReturnsTheValue()
{
    var principal = new ClaimsPrincipal();
    principal.AddIdentity(new ClaimsIdentity(new List<Claim> {new Claim("type", "1234")}));

    var value = principal.FindFirstValue("type");

    Assert.AreEqual(value,"1234");
 }
1 голос
/ 17 марта 2019

Ваш метод расширения является оберткой вокруг FindFirst, так что это метод, который вы на самом деле хотите смоделировать.Вам повезло :), так как ClaimPrincipal.FindFirst - это метод virtual, его можно высмеять.

//Arrange
var principal = new Mock<ClaimsPrincipal>();
principal
    .Setup(m => m.FindFirst(It.IsAny<string>()))
    .Returns(new Claim("name", "John Doe"));

//Act
string value = principal.Object.FindFirstValue("claimType", true);

//Assert
Assert.AreEqual("John Doe", value);
...