Мы разрабатываем что-то вроде 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: Так есть ли какое-либо обходное решение для этого, чтобы работать или это обременительная идея, обременительная?
Это звучит, как вам нужно, чтобы создать свой собственный язык. –
Есть и другие, которые сделали это, например. SpecFlow, однако, мы считаем, что создание собственной DSL резко снижает принятие пользователем рамки. –
Пожалуйста, сделайте свое будущее самостоятельно и выберите лучшие имена классов (когда/дано/должно быть), в противном случае вы после [По умолчанию?] (Http://msdn.microsoft.com/en-us/library/xwth0h0d.aspx) – Sayse