Гренсеснитт с классами без конструкторов без параметров? - PullRequest
1 голос
/ 15 декабря 2010

Интересно, кто-нибудь пробовал использовать Grensesnitt для модульного тестирования классов, которые следуют одному и тому же интерфейсу .У меня проблема с классами, которые не имеют конструкторов без параметров.Я знаю, что есть GrensesnittObjectLocator, но я не могу понять, как его использовать.

Пожалуйста, посоветуйте, как проверить эти классы, у которых нет конструкторов без параметров с grensesnitt.

1 Ответ

0 голосов
/ 21 декабря 2010

Мне не удалось сделать это из коробки.Мне пришлось немного подправить.Поэтому внутри метода GrensesnittObjectLocator.GetHandler вместо:

public static Func<object> GetHandler(Type T)
{
    Func<object> handler;
    if (handleAll != null) return () => { return handleAll(T); };
    if (map.TryGetValue(T, out handler))
    {
        return (Func<object>)handler;
    }
    return () => { return TryReflections(T); };
}   

я изменил его на:

public static Func<object> GetHandler(Type T)
{
    return () =>
    {
        Func<object> handler;
        if (handleAll != null) return handleAll(T);
        if (map.TryGetValue(T, out handler))
        {
            return handler();
        }
        return TryReflections(T);
    };
}       

С этой модификацией я написал следующий пример:

public interface IFoo
{
    int Add(int a, int b);
}

public class Foo : IFoo
{
    private readonly string _foo;
    public Foo(string foo)
    {
        _foo = foo;
    }

    public int Add(int a, int b)
    {
        return a + b;
    }
}

Вы можете видеть, как класс Foo не имеет конструктора по умолчанию.Итак, теперь у нас может быть этот тест:

[InterfaceSpecification]
public class IFooTests : AppliesToAll<IFoo>
{
    [Test]
    public void can_add_two_numbers()
    {
        Assert.AreEqual(5, subject.Add(2, 3));
    }
}

И чтобы указать grensesnitt, как создать экземпляр Foo, просто добавьте следующий класс в свою тестовую сборку (ту же сборку, которая содержит предыдущий модультест):

[SetUpFixture]
public class Config
{
    [SetUp]
    public void SetUp()
    {
        // indicate to Grensesnitt that the Foo class
        // doesn't have a default constructor and that 
        // it is up to you to provide an instance
        GrensesnittObjectLocator.Register<Foo>(() =>
        {
            return new Foo("abc");
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...