C# 单元测试一种使用(动态)Moq的方法

C# 单元测试一种使用(动态)Moq的方法,c#,unit-testing,dynamic,moq,C#,Unit Testing,Dynamic,Moq,我有以下方法: 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 im

我有以下方法:

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是实现iQueueRestorage的依赖项。我希望对它进行单元测试,但(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);
}
timesAddedToQueuCalled
未递增。我试过使用
It.IsAny
(testCommand)
都没有用。似乎没有执行回调方法。有人能看出我做错了什么吗

编辑:iqueustorage代码:

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

    T ReadFromQueue<T>() where T : class;
}
公共接口iqueustorage
{
void AddToQueue(T项),其中T:class;
T ReadFromQueue(),其中T:class;
}

下面是一段工作正常的代码:

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 {}
公共类AzureCommandQueueManager
{
公共无效队列(ICommand itemToQueue)
{
if(itemToQueue==null)
抛出新ArgumentNullException(“itemToQueue”);
AddToQueue((动态)itemToQueue);
}
公共IQueueStorage队列存储{get;set;}
}
公共接口iqueustorage
{
void AddToQueue(T命令),其中T:class;
}
公共类TestCommand:ICommand{}
公共接口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);
}
[测试]
public void Enqueue_ItemGiven_AddToQueueCalledOnQueueStorage()
{
int timesAddToQueueCalled=0;
var dummyQueueStorage=new Mock();
var testCommand=new testCommand();
var queueManager=new AzureCommandQueueManager();
dummyQueueStorage
.Setup(x=>x.AddToQueue(It.IsAny()))
.Callback(()=>timesAddToQueueCalled++);
queueManager.QueueStorage=dummyQueueStorage.Object;
queueManager.Enqueue(testCommand);
AreEqual(1,timesAddToQueueCalled);
}

我看到的唯一区别是,您有
TestCommand
类的
private
修饰符。顺便说一句,如果它是私有的,您如何从测试中访问该类?

我根本看不出您需要
动态的
。为什么
AddToQueue()
的参数类型是否是接口很重要?实际类型无论如何都不能是接口。您提供的代码工作正常。你在IQueueStorage中有几个重载的AddToQueue方法吗?@Attila我正在使用Azure队列存储;如果将XMLSerializer与泛型方法一起使用,则需要知道它序列化到队列中的内容。@lazyberezovsky Single
AddToQueue
iqueuestreage中的方法。我将把AddToQueue签名添加到question@Click-Rex您正在使用
It.IsAny()
?检查是否有类似于
It.IsAny()
的东西该类嵌入到测试类My god中;它是
private
修饰符;将其公开表示AzureCommandQueueManager可以读取。谢谢你的帮助!
[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);
}