TestStack / TestStack.BDDfy

BDDfy is the simplest BDD framework EVER!
MIT License
419 stars 84 forks source link

Inheriting tests produce unexpected test name #187

Open powerdude opened 9 years ago

powerdude commented 9 years ago

Hello,

If I take the example and tweak it like so:

[TestClass] [Story( Title = "UI Account holder withdraws cash", AsA = "As an Account Holder", IWant = "I want to withdraw cash from an ATM", SoThat = "So that I can get money when the bank is closed")] public class UiAccountHolderWithCash : AccountHolderWithdrawsCashFluentScanner {

    public override void AndTheAccountBalanceShouldBe(int balance)
    {
        Assert.AreEqual(balance, _card.AccountBalance);
    }

    public override void CardIsRetained(bool cardIsRetained)
    {
        Assert.AreEqual(cardIsRetained, _atm.CardIsRetained);
    }
}

//[TestClass]
//[Story(
//    Title = "Account holder withdraws cash",
//    AsA = "As an Account Holder",
//    IWant = "I want to withdraw cash from an ATM",
//    SoThat = "So that I can get money when the bank is closed")]
public abstract class AccountHolderWithdrawsCashFluentScanner
{
    private const string GivenTheAccountBalanceIsTitleTemplate =
                "Given the account balance is ${0}";
    private const string AndTheMachineContainsEnoughMoneyTitleTemplate =
                "And the machine contains enough money";
    private const string WhenTheAccountHolderRequestsTitleTemplate =
                "When the account holder requests ${0}";
    private const string AndTheCardShouldBeReturnedTitleTemplate =
                "And the card should be returned";

    protected Card _card;
    protected Atm _atm;

    public void GivenTheAccountBalanceIs(int balance)
    {
        _card = new Card(true, balance);
    }

    public void GivenTheCardIsDisabled()
    {
        _card = new Card(false, 100);
        _atm = new Atm(100);
    }

    public void AndTheCardIsValid()
    {
    }

    public void AndTheMachineContains(int atmBalance)
    {
        _atm = new Atm(atmBalance);
    }

    public void WhenTheAccountHolderRequests(int moneyRequest)
    {
        _atm.RequestMoney(_card, moneyRequest);
    }

    public void TheAtmShouldDispense(int dispensedMoney)
    {
        Assert.AreEqual(dispensedMoney, _atm.DispenseValue);
    }

    public abstract void AndTheAccountBalanceShouldBe(int balance);

    public abstract void CardIsRetained(bool cardIsRetained);

    void AndTheAtmShouldSayThereAreInsufficientFunds()
    {
        Assert.AreEqual(DisplayMessage.InsufficientFunds, _atm.Message);
    }

    void AndTheAtmShouldSayTheCardHasBeenRetained()
    {
        Assert.AreEqual(DisplayMessage.CardIsRetained, _atm.Message);
    }

    [TestMethod]
    public void AccountHasInsufficientFund()
    {
        this.Given(s => s.GivenTheAccountBalanceIs(10),
        GivenTheAccountBalanceIsTitleTemplate)
                .And(s => s.AndTheCardIsValid())
                .And(s => s.AndTheMachineContains(100),
        AndTheMachineContainsEnoughMoneyTitleTemplate)
            .When(s => s.WhenTheAccountHolderRequests(20),
        WhenTheAccountHolderRequestsTitleTemplate)
            .Then(s => s.TheAtmShouldDispense(0), "Then the ATM should not dispense")
                .And(s => s.AndTheAtmShouldSayThereAreInsufficientFunds())
                .And(s => s.AndTheAccountBalanceShouldBe(10))
                .And(s => s.CardIsRetained(false),
        AndTheCardShouldBeReturnedTitleTemplate)
            .BDDfy();
    }

    [TestMethod]
    public void AccountHasSufficientFund()
    {
        this.Given(s => s.GivenTheAccountBalanceIs(100),
        GivenTheAccountBalanceIsTitleTemplate)
                .And(s => s.AndTheCardIsValid())
                .And(s => s.AndTheMachineContains(100),
        AndTheMachineContainsEnoughMoneyTitleTemplate)
            .When(s => s.WhenTheAccountHolderRequests(20),
        WhenTheAccountHolderRequestsTitleTemplate)
            .Then(s => s.TheAtmShouldDispense(20), "Then the ATM should dispense $20")
                .And(s => s.AndTheAccountBalanceShouldBe(80),
        "And the account balance should be $80")
                .And(s => s.CardIsRetained(false),
        AndTheCardShouldBeReturnedTitleTemplate)
            .BDDfy();
    }

    [TestMethod]
    public void CardHasBeenDisabled()
    {
        this.Given(s => s.GivenTheCardIsDisabled())
            .When(s => s.WhenTheAccountHolderRequests(20))
            .Then(s => s.CardIsRetained(true), "Then the ATM should retain the card")
                .And(s => s.AndTheAtmShouldSayTheCardHasBeenRetained())
            .BDDfy();
    }
}

I'd hope to see an error for UiAccountHolderWithCash.CardHasBeenDisabled. Instead i get UiAccountHolderWithCash.AccountHolderWithdrawsCashFluentScanner.CardHasBeenDisabled.

JakeGinnivan commented 9 years ago

Hey @powerdude

Could you submit a failing test which replicates the issue. Even better a pull request fixing the issue, but a failing test would be enough.