2013-07-03 3 views
1

Мы разрабатываем что-то вроде Spec-основы (например, MSpec, NSpec и т.д.) и хотим, чтобы различать методы в классе спецификации во время выполнения:Отличительные методы во время выполнения обратного типа

public class AccountSpecs 
{ 
    private Account sut; // subject under test 

    Given an_account() { sut = new Account(); } 

    When changing_owner() 
    { 
     var result = sut.ChangeOwner("new owner"); 
     It["returns_previous_owner"] =() => result.ShouldBe("old owner"); 
    } 
} 

Как вам может видеть, что этот класс не компилируется, потому что an_account() и change_owner() не имеют операторов возврата.

Q1: Я полагаю, что в C# нет абсолютно никакого способа указать, что «return null» используется по умолчанию, если не указан оператор возврата?

Как нет глобальных псевдонимов типов (что-то вроде typedef When as System.Void), мы вынуждены фактически вводить классы Given и When и заставлять наших пользователей возвращать что-то в этих методах.

Мы используем оператор return в методах When для When.ENABLED или When.DISABLED("reason") для временного отключения спецификаций.

В «заданных методах» мы хотим вернуть испытуемый объект. Мы хотим, чтобы включить следующее:

Given an_account() { sut = new Account(); return sut; } 

Однако: «Не удается преобразовать тип выражения ... для возврата типа ...»

Далее мы думали о неявном операторе преобразования для любого объекта Учитывая, однако это также не допускается в C#, см.: cs0553 user-defined conversion from base class not allowed

Q2: Так есть ли какое-либо обходное решение для этого, чтобы работать или это обременительная идея, обременительная?

+3

Это звучит, как вам нужно, чтобы создать свой собственный язык. –

+0

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

+0

Пожалуйста, сделайте свое будущее самостоятельно и выберите лучшие имена классов (когда/дано/должно быть), в противном случае вы после [По умолчанию?] (Http://msdn.microsoft.com/en-us/library/xwth0h0d.aspx) – Sayse

ответ

1

Есть много вариантов, если вы немного измените свой дизайн.

  1. Вы можете добавить porperty к данному типу, который будет держать в Refernce к любому объекту, так что an_account будет return Given(sut)
  2. Вы можете вернуть простой объект из an_account и пометить метод с [Given] атрибутом
  3. Вы можете также избавиться от этого подхода «метод в классе» и просто использовать шаблон строителя с плавным интерфейсом, например linq, для создания определения теста.

Как это:

new Test() 
    .Given(() =>new Account()) 
    .When(()=> ...); 
+0

Спасибо.На самом деле это не ответ, поскольку, похоже, на мой вопрос нет такого вопроса, но я думаю, что это самое лучшее. –

Смежные вопросы