0

私は以下の方法を持っています:

public void Enqueue(ICommand itemToQueue)
{
    if (itemToQueue == null)
    {
        throw new ArgumentNullException("itemToQueue");
    }

    // Using the dynamic keywork to ensure the type passed in to the generic
    // method is the implementation type; not the interface.
    QueueStorage.AddToQueue((dynamic)itemToQueue);
}

QueueStorage は、IQueueStorage を実装する依存関係です。単体テストをしたいのですが、(dynamic) キーワードが Moq の適切なバインドを妨げているようです。このキーワードは、キューに追加されるときに、ICommand インターフェイス タイプではなく具象クラス タイプを正しく割り当てるために使用されます。

単体テストは次のようになります。

[Test]
public void Enqueue_ItemGiven_AddToQueueCalledOnQueueStorage()
{
    int timesAddToQueueCalled = 0;

    var dummyQueueStorage = new Mock<IQueueStorage>();
    var testCommand = new TestCommand();

    var queueManager = new AzureCommandQueueManager();

    dummyQueueStorage
        .Setup(x => x.AddToQueue(It.IsAny<TestCommand>()))
        .Callback(() => timesAddToQueueCalled++);

    queueManager.QueueStorage = dummyQueueStorage.Object;

    queueManager.Enqueue(testCommand);

    Assert.AreEqual(1, timesAddToQueueCalled);
}

テスト コマンドは ICommand の空の実装ですが、次のようになります。

private class TestCommand : ICommand
{
}

public interface ICommand
{
}

timesAddedToQueuCalledインクリメントされていません。使ってみましIt.IsAny<ICommand>(testCommand)がダメでした。Callback メソッドが実行されていないようです。誰かが私が間違っていることを見ることができますか?

編集: IQueueStorage コード:

public interface IQueueStorage
{
    void AddToQueue<T>(T item) where T : class;

    T ReadFromQueue<T>() where T : class;
}
4

1 に答える 1

2

問題なく動作するコードは次のとおりです。

public class AzureCommandQueueManager
{
    public void Enqueue(ICommand itemToQueue)
    {
        if (itemToQueue == null)            
            throw new ArgumentNullException("itemToQueue");

        QueueStorage.AddToQueue((dynamic)itemToQueue);
    }

    public IQueueStorage QueueStorage { get; set; }
}

public interface IQueueStorage
{
    void AddToQueue<T>(T command) where T : class;        
}

public class TestCommand : ICommand  {}

public interface ICommand {}

そしてテスト方法:

[Test]
public void Enqueue_ItemGiven_AddToQueueCalledOnQueueStorage()
{
    int timesAddToQueueCalled = 0;

    var dummyQueueStorage = new Mock<IQueueStorage>();
    var testCommand = new TestCommand();

    var queueManager = new AzureCommandQueueManager();

    dummyQueueStorage
        .Setup(x => x.AddToQueue(It.IsAny<TestCommand>()))
        .Callback(() => timesAddToQueueCalled++);

    queueManager.QueueStorage = dummyQueueStorage.Object;

    queueManager.Enqueue(testCommand);

    Assert.AreEqual(1, timesAddToQueueCalled);
}

私が見る唯一の違いは、クラスprivateの修飾子があることです。TestCommandところで、プライベートの場合、テストからそのクラスにどのようにアクセスしますか?

于 2012-05-16T12:47:44.363 に答える