Пожалуйста, обратите внимание на следующий код:Почему поведение Matching.ImplementedInterfaces отличается от Matching.ExactType и FrozenAttribute.As?
public class TestingSample
{
public class FactoryClass : Class {}
public class Class : IInterface {}
public interface IInterface {}
public class AutoData : AutoDataAttribute
{
public AutoData() : base(Create()) {}
static IFixture Create()
{
var fixture = new Fixture();
fixture.Customize<IInterface>(composer => composer.FromFactory(() => new FactoryClass()));
fixture.Customize<Class>(composer => composer.FromFactory(() => new FactoryClass()));
return fixture;
}
}
[Theory, TestingSample.AutoData]
public void OldSkool([Frozen(As = typeof(IInterface))]Class first, Class second, IInterface third)
{
Assert.IsType<FactoryClass>(first);
Assert.Same(first, second);
Assert.Same(first, third);
}
[Theory, TestingSample.AutoData]
public void DirectBaseType([Frozen(Matching.ExactType)]Class first, Class second)
{
Assert.IsType<FactoryClass>(first);
Assert.Same(first, second);
}
[Theory, TestingSample.AutoData]
public void ImplementedInterfaces([Frozen(Matching.ImplementedInterfaces)]Class first, IInterface second)
{
Assert.IsType<FactoryClass>(first);
Assert.Same(first, second); // The Fails.
}
}
Как вы можете (я надеюсь) увидеть, тест ImplementedInterfaces
терпит неудачу. Поскольку FrozenAttribute.As
устарел, и пользователи были перенаправлены на перечисление совпадений, я ожидал, что он будет вести себя так же, как и раньше.
Однако, похоже, что Match.ImplementedInterfaces
ведет себя иначе как от Match.ExactType
, так и от FrozenAttribute.As
.
я сделал некоторые спелеология и увидел, что Match.ExactType
и FrozenAttribute.As
воспользоваться SeedRequestSpecification
тогда Match.ImplementedInterfaces
соответствует только на Type
запросов.
Возможно ли получить некоторый контекст вокруг этого поведения? Это по дизайну? И если да, существует ли известная рекомендация по дизайну таким образом, чтобы восстановить старое поведение, используя Match.ImplementedInterfaces
?
Фантастический, всесторонний ответ (как всегда!) @ Mark-seemann. Очень признателен. Вы действительно правильно относитесь к неудачному тесту оговорки/неправильно (отмеченному). Это было ошибкой в том, как я читал результаты (без фактического нажатия строки для проверки). Чтобы понять суть проблемы, это, скорее всего, потому, что я все еще изучаю TDD и тестирование в целом, но, как и насмешка, мне нравится идея использовать фабрику для создания моего SUT (или поддерживающих объектов) и использовать его внутри тест. В этом суть проблемы здесь: создать элемент с фабрики и заморозить его (как одноэлементный). –