MoQ + Настройка через соглашения - PullRequest
1 голос
/ 07 июля 2011

Можно ли настроить ожидания фиктивного объекта с помощью режима соглашений и примера?

Т.е.

class Foo
{
     public virtual int? Abc { get; set; } // <-- Convention: Ignore nullable if null 
     public virtual string Xyz { get; set; } // <-- Convention: Ignore null
     public virtual int Dingdong { get; set; } // <-- Convention: Ignore if greater than 10
}

Есть ли альтернатива этому или нужно изменить источникдля достижения этой цели?Или есть библиотека, которая может это сделать?

Ответы [ 2 ]

1 голос
/ 10 января 2013

Вы можете определить набор соглашений в ваших AssemblyInitialize, используя выражения It.Is(..), и использовать их во время настройки теста.

Было бы также легко определить некоторые вспомогательные методы вокруг него.Например, вы можете отразить синтаксис It.IsAny<T>() с помощью метода ItExt.IsConventional<T>().Вот возможная реализация:

public static class ItExt
{
    private static readonly Dictionary<Type, object> RegisteredConventions = new Dictionary<Type, object>();

    public static void RegisterConvention<T>(Func<T> convention)
    {
        RegisteredConventions.Add(typeof(T), convention);
    }

    public static T IsConventional<T>()
    {
        Func<T> conventionFunc = (Func<T>)RegisteredConventions[typeof(T)];
        return conventionFunc();
    }
}

И использование:

[TestClass]
public class FooTests
{
    [AssemblyInitialize]
    public static void AssemblyInitialize(TestContext context)
    {
        ItExt.RegisterConvention(() => It.Is<int?>(n => n.HasValue));
    }

    [TestMethod]
    public void FooTest()
    {
        // Arrange
        Mock<IFoo> fooMock = new Mock<IFoo>();
        fooMock.Setup(f => f.Bar(ItExt.IsConventional<int?>()))
               .Verifiable();

        // Act
        fooMock.Object.Bar(1);

        // Assert
        fooMock.VerifyAll(); // throws
    }
}

Обратите внимание, что определения соглашений должны храниться как Func<T>, так что выражение доступно для оценки внутри Mock<T>.Setup Звоните.

0 голосов
/ 15 декабря 2011

Вы не можете сделать это с Moq, и я не знаю ни одной библиотеки, которая может сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...