3 Stimmen

Unit Testing Stubbed Methode

Angesichts dieser Klasse:

public class OrderService
{
    public OrderService(IOrderLogger log)
    {
        this.log = log;
    }

    private readonly IOrderLogger log;

    public void PurgeOrder(Order order)
    {
        ...

        var action = new LogAction("foo","bar");
        log.Action(action);
    }
}   

Und diesem Test:

[Fact]
public void PurgeOrder_should_log_action()
{
    var order = new Order();
    var logger = MockRepository.GenerateStub();
    var service = new OrderService(logger);

    service.PurgeOrder(order);

    logger.AssertWasCalled(x => x.Action(????));
}   

Offensichtlich ist der Test falsch. Wie kann ich sicherstellen, dass OrderLogger.Action(...) in diesem Szenario tatsächlich aufgerufen wurde? Wenn die LogAction innerhalb der PurgeOrder-Methode instanziiert wird, sehe ich nicht, wie das möglich ist. Irgendwelche Vorschläge?

1voto

Grzenio Punkte 34566

Sie benötigen eine Möglichkeit, LogActions zu vergleichen. Sie können entweder Equals in LogAction implementieren (wenn es aus dem Programmlogik-Sicht Sinn macht) oder einen Vergleicher als Teil der Tests implementieren. Im ersten Fall würden Sie denselben LogAction wie im Produktionscode erstellen.

1voto

Dror Helper Punkte 29647

[Haftungsausschluss: Ich arbeite bei Typemock]

Soweit ich weiß, ist das einzige Tool, das Erwartungen setzen und überprüfen kann, ob Methoden aufgerufen wurden, Typemock Isolator. Die Zukunft, nach der Sie suchen, ist als "future objects" bekannt, die dabei helfen, Verhalten zu setzen und auf Objekten zu überprüfen, die "im Code unter Test erstellt werden sollen":

[Tatsache]
public void PurgeOrder_soll_Aktion_loggen()
{
    var order = new Order();
    var logger = Isolate.Fake.Instance();    
    var logAction = Isolate.Fake.Instance();
    Isolate.Swap.NextInstance().With(logAction);

    var service = new OrderService(logger);
    service.PurgeOrder(order);

    Isolate.Verify.WasCalledWithExactArguments(() => logger.Action(logAction));
}

0voto

jaketrent Punkte 1163

Ich würde Mocks verwenden, so etwas wie EasyMock, wo Sie den IOrderLogger mocken könnten und dann so etwas machen könnten:

IOrderLogger log = EasyMock.createMock(IOrderLogger.class);
log.Action(EasyMock.isA(LogAction.class));
EasyMock.expectLastCall();

Dies setzt voraus, dass Action() void zurückgibt. Dies ist eine sehr Java-typische Art, dies zu tun. Ich bin mir nicht sicher, wie weit EasyMock.net fortgeschritten ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X