Есть ли шаблон проектирования, соответствующий этому подходу? - PullRequest
1 голос
/ 23 августа 2011

У меня есть один DTO, у которого есть только простые свойства.

Я хотел бы сделать несколько тестов на экземплярах DTO, скажем, вроде: IsOld, IsFromBataFamily и т. Д.

Я думалрасширить класс DTO и реализовать эти методы тестера.

public class TestableDTO : DTO
{

  public bool IsOld() { // some logic }
  public bool IsFromBataFamily () { // some logic }

}

Существует ли какой-либо шаблон проектирования, соответствующий этому подходу (расширение класса DTO для добавления в него нескольких тестеров для классификации его категории)?

Можете назвать это, пожалуйста?

Ответы [ 4 ]

1 голос
/ 23 августа 2011

Это просто наследование, не уверен, что с ним связан шаблон.Если ваша TestableDTO содержит внутреннюю ссылку DTO с целью добавления к ней членов, то это будет шаблон Decorator или, по крайней мере, его разновидность.

public class TestableDTO
{
    private DTO _dto;

    public bool IsOld() { // some logic }
    public bool IsFromBataFamily () { // some logic }

    // Expose DTO public members again...
}

Таким образом, короткий ответнет, в настоящее время это не «шаблон проектирования» как таковой, а скорее ОО-парадигма наследования класса или расширяемости.

Просто чтобы уточнить, что вы сделали, чтобы добавить членов в класс, - это прекрасно.,Однако причины этого (только для тестирования) могут показаться немного странными, так как вы должны просто иметь возможность напрямую тестировать DTO.

0 голосов
/ 23 августа 2011

Это не ответит на ваш вопрос, но разве следующее не будет лучшим подходом?

[Flags]
public enum TestDTOFlags
{
    None = 0,
    Old = 1,
    FromBataFamily = 2
}

public class TestableDTO : DTO 
{
  public TestDTOFlags DetermineFlags() { /* some logic */ }
}

Чтобы еще больше отделить это от вашей бизнес-логики, возможно, это может быть метод расширения в вашем наборе тестов:

public static class DTOExtensions
{
  public static TestDTOFlags DetermineFlags(this DTO target) { /* some logic */ }
}
0 голосов
/ 23 августа 2011

Если вы пытаетесь расширить определенный DTO для целей юнит-теста, самый простой и чистый способ - это реализовать метод расширения - например,

public static Class DtoExtensionMethods {
public static bool IsTooOld(this SomeSpecificDto specificDto)
{
    return specificDto.LastModified < DateTime.Now - TimeSpan.FromHours(2) ;
}}
0 голосов
/ 23 августа 2011

Это похоже на шаблон декоратора, но не совсем. Самая близкая вещь, о которой я могу думать, - это расширение наследованием или специализацией.

Рой Ошеров описывает метод «Извлечение и переопределение», о котором вы можете прочитать в его книге «Искусство модульного тестирования» (которую я очень рекомендую). онлайн глава описывает это.

Это должно дать некоторые лучшие идеи о том, как использовать наследование, чтобы сделать объекты более тестируемыми.

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