Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Moq验证特定参数 public void submitmessagesgestoqueue\u OneMessage\u SubmitSuccessfully() { var messageServiceClientMock=new Mock(); var queueableMessage=CreateSingleQueueableMessage(); var message=queueableMessage[0]; var xml=QueueableMessageAsXml(queueableMessage); messageServiceClientMock.Setup(proxy=>proxy.SubmitMessage(xml)).Verifiable(); //messageServiceClientMock.Setup(proxy=>proxy.SubmitMessage(It.IsAny()).Verifiable(); var serviceProxyFactoryStub=new Mock(); serviceProxyFactoryStub.Setup(proxyFactory=>proxyFactory.CreateProxy()).Returns(essageServiceClientMock.Object); var loggerStub=new Mock(); var client=new MessageClient(serviceProxyFactoryStub.Object,loggerStub.Object); client.SubmitMessagesToQueue(新列表{message}); //messageServiceClientMock.Verify(proxy=>proxy.SubmitMessage(xml),Times.Once()); messageServiceClientMock.Verify(); }_C#_Unit Testing_Nunit_Moq - Fatal编程技术网

C# 使用Moq验证特定参数 public void submitmessagesgestoqueue\u OneMessage\u SubmitSuccessfully() { var messageServiceClientMock=new Mock(); var queueableMessage=CreateSingleQueueableMessage(); var message=queueableMessage[0]; var xml=QueueableMessageAsXml(queueableMessage); messageServiceClientMock.Setup(proxy=>proxy.SubmitMessage(xml)).Verifiable(); //messageServiceClientMock.Setup(proxy=>proxy.SubmitMessage(It.IsAny()).Verifiable(); var serviceProxyFactoryStub=new Mock(); serviceProxyFactoryStub.Setup(proxyFactory=>proxyFactory.CreateProxy()).Returns(essageServiceClientMock.Object); var loggerStub=new Mock(); var client=new MessageClient(serviceProxyFactoryStub.Object,loggerStub.Object); client.SubmitMessagesToQueue(新列表{message}); //messageServiceClientMock.Verify(proxy=>proxy.SubmitMessage(xml),Times.Once()); messageServiceClientMock.Verify(); }

C# 使用Moq验证特定参数 public void submitmessagesgestoqueue\u OneMessage\u SubmitSuccessfully() { var messageServiceClientMock=new Mock(); var queueableMessage=CreateSingleQueueableMessage(); var message=queueableMessage[0]; var xml=QueueableMessageAsXml(queueableMessage); messageServiceClientMock.Setup(proxy=>proxy.SubmitMessage(xml)).Verifiable(); //messageServiceClientMock.Setup(proxy=>proxy.SubmitMessage(It.IsAny()).Verifiable(); var serviceProxyFactoryStub=new Mock(); serviceProxyFactoryStub.Setup(proxyFactory=>proxyFactory.CreateProxy()).Returns(essageServiceClientMock.Object); var loggerStub=new Mock(); var client=new MessageClient(serviceProxyFactoryStub.Object,loggerStub.Object); client.SubmitMessagesToQueue(新列表{message}); //messageServiceClientMock.Verify(proxy=>proxy.SubmitMessage(xml),Times.Once()); messageServiceClientMock.Verify(); },c#,unit-testing,nunit,moq,C#,Unit Testing,Nunit,Moq,我开始使用最小起订量,有点挣扎。 我试图验证messageServiceClient是否接收到正确的参数,该参数是一个XmlElement,但我找不到任何方法使其工作。只有当我不检查某个特定值时,它才起作用 有什么想法吗 部分答覆: 我找到了一种方法来测试发送到代理的xml是否正确,但我仍然认为这不是正确的方法 public void SubmitMessagesToQueue_OneMessage_SubmitSuccessfully() { var messageServiceCli

我开始使用最小起订量,有点挣扎。 我试图验证messageServiceClient是否接收到正确的参数,该参数是一个XmlElement,但我找不到任何方法使其工作。只有当我不检查某个特定值时,它才起作用

有什么想法吗

部分答覆: 我找到了一种方法来测试发送到代理的xml是否正确,但我仍然认为这不是正确的方法

public void SubmitMessagesToQueue_OneMessage_SubmitSuccessfully()
{
    var messageServiceClientMock = new Mock<IMessageServiceClient>();
    var queueableMessage = CreateSingleQueueableMessage();
    var message = queueableMessage[0];
    var xml = QueueableMessageAsXml(queueableMessage);
    messageServiceClientMock.Setup(proxy => proxy.SubmitMessage(xml)).Verifiable();
    //messageServiceClientMock.Setup(proxy => proxy.SubmitMessage(It.IsAny<XmlElement>())).Verifiable();

    var serviceProxyFactoryStub = new Mock<IMessageServiceClientFactory>();
    serviceProxyFactoryStub.Setup(proxyFactory => proxyFactory.CreateProxy()).Returns(essageServiceClientMock.Object);
    var loggerStub = new Mock<ILogger>();

    var client = new MessageClient(serviceProxyFactoryStub.Object, loggerStub.Object);
    client.SubmitMessagesToQueue(new List<IMessageRequestDTO> {message});

    //messageServiceClientMock.Verify(proxy => proxy.SubmitMessage(xml), Times.Once());
    messageServiceClientMock.Verify();
}
public void SubmitMessagesToQueue_OneMessage_SubmitSuccessfully()
{
    var messageServiceClientMock = new Mock<IMessageServiceClient>();
    messageServiceClientMock.Setup(proxy => proxy.SubmitMessage(It.IsAny<XmlElement>())).Verifiable();
    var serviceProxyFactoryStub = new Mock<IMessageServiceClientFactory>();
    serviceProxyFactoryStub.Setup(proxyFactory => proxyFactory.CreateProxy()).Returns(messageServiceClientMock.Object);
    var loggerStub = new Mock<ILogger>();

    var client = new MessageClient(serviceProxyFactoryStub.Object, loggerStub.Object);
    var message = CreateMessage();
    client.SubmitMessagesToQueue(new List<IMessageRequestDTO> {message});

    messageServiceClientMock.Verify(proxy => proxy.SubmitMessage(It.Is<XmlElement>(xmlElement => XMLDeserializer<QueueableMessage>.Deserialize(xmlElement).Messages.Contains(message))), Times.Once());
}
public void submitmessagesgestoqueue\u OneMessage\u SubmitSuccessfully()
{
var messageServiceClientMock=new Mock();
messageServiceClientMock.Setup(proxy=>proxy.SubmitMessage(It.IsAny()).Verifiable();
var serviceProxyFactoryStub=new Mock();
serviceProxyFactoryStub.Setup(proxyFactory=>proxyFactory.CreateProxy()).Returns(messageServiceClientMock.Object);
var loggerStub=new Mock();
var client=new MessageClient(serviceProxyFactoryStub.Object,loggerStub.Object);
var message=CreateMessage();
client.SubmitMessagesToQueue(新列表{message});
messageServiceClientMock.Verify(proxy=>proxy.SubmitMessage(It.Is(xmlement=>xmlderserializer.Deserialize(xmlement.Messages.Contains(message))),Times.Once();
}

顺便问一下,如何从验证调用中提取表达式?

我一直在以相同的方式验证调用-我相信这是正确的方法

public void SubmitMessagesToQueue_OneMessage_SubmitSuccessfully()
{
    var messageServiceClientMock = new Mock<IMessageServiceClient>();
    var queueableMessage = CreateSingleQueueableMessage();
    var message = queueableMessage[0];
    var xml = QueueableMessageAsXml(queueableMessage);
    messageServiceClientMock.Setup(proxy => proxy.SubmitMessage(xml)).Verifiable();
    //messageServiceClientMock.Setup(proxy => proxy.SubmitMessage(It.IsAny<XmlElement>())).Verifiable();

    var serviceProxyFactoryStub = new Mock<IMessageServiceClientFactory>();
    serviceProxyFactoryStub.Setup(proxyFactory => proxyFactory.CreateProxy()).Returns(essageServiceClientMock.Object);
    var loggerStub = new Mock<ILogger>();

    var client = new MessageClient(serviceProxyFactoryStub.Object, loggerStub.Object);
    client.SubmitMessagesToQueue(new List<IMessageRequestDTO> {message});

    //messageServiceClientMock.Verify(proxy => proxy.SubmitMessage(xml), Times.Once());
    messageServiceClientMock.Verify();
}
public void SubmitMessagesToQueue_OneMessage_SubmitSuccessfully()
{
    var messageServiceClientMock = new Mock<IMessageServiceClient>();
    messageServiceClientMock.Setup(proxy => proxy.SubmitMessage(It.IsAny<XmlElement>())).Verifiable();
    var serviceProxyFactoryStub = new Mock<IMessageServiceClientFactory>();
    serviceProxyFactoryStub.Setup(proxyFactory => proxyFactory.CreateProxy()).Returns(messageServiceClientMock.Object);
    var loggerStub = new Mock<ILogger>();

    var client = new MessageClient(serviceProxyFactoryStub.Object, loggerStub.Object);
    var message = CreateMessage();
    client.SubmitMessagesToQueue(new List<IMessageRequestDTO> {message});

    messageServiceClientMock.Verify(proxy => proxy.SubmitMessage(It.Is<XmlElement>(xmlElement => XMLDeserializer<QueueableMessage>.Deserialize(xmlElement).Messages.Contains(message))), Times.Once());
}

另外,请注意Mock中的一个bug,其中错误消息表示该方法被多次调用,而它根本没有被调用。他们现在可能已经修复了它——但是如果你看到这个消息,你可能会考虑验证这个方法实际上是被调用的。< /P> 编辑:下面是一个多次调用verify的示例,用于验证是否为列表中的每个对象调用了函数(例如)

因此,每次为该itemId调用GetStuff时,它都会返回特定于该项的内容。或者,您可以使用一个函数,将itemId作为输入并返回内容

foreach (var item in myList) {
  var stuff = ... // some result specific to the item
  this.mockRepository
    .Setup(mr => mr.GetStuff(item.itemId))
    .Returns(stuff);
}
this.mockRepository
.Setup(mr=>mr.GetStuff(It.IsAny()))
.Returns((int id)=>somefunctionthattreturnsstuff(id));

前一段时间我在博客上看到的另一种方法(可能是Phil Haack?)设置了从某种出列对象返回的方法——每次调用该函数时,它都会从队列中拖出一个项目。

我相信,问题在于Moq将检查是否相等。而且,由于XmlElement不重写Equals,所以它的实现将检查引用的相等性


您不能使用自定义对象,以便覆盖equals吗?

如果验证逻辑非常重要,那么编写大型lambda方法将非常麻烦(如您的示例所示)。您可以将所有测试语句放在一个单独的方法中,但我不喜欢这样做,因为它会中断读取测试代码的流程

另一个选项是对Setup调用使用回调来存储传递到mock方法中的值,然后编写标准的
Assert
方法来验证它。例如:

this.mockRepository
    .Setup(mr => mr.GetStuff(It.IsAny<int>()))
    .Returns((int id) => SomeFunctionThatReturnsStuff(id));
//排列
MyObject保存对象;
mock.Setup(c=>c.Method(It.IsAny(),It.IsAny())
.Callback((i,obj)=>saveObject=obj)
.返回(“xyzzy”);
//表演
// ...
//断言
//验证方法只调用了一次
mock.Verify(c=>c.Method(It.IsAny(),It.IsAny()),Times.Once());
//关于saveObject的断言
Assert.That(saveObject.TheProperty,Is.EqualTo(2));

更简单的方法是:

// Arrange
MyObject saveObject;
mock.Setup(c => c.Method(It.IsAny<int>(), It.IsAny<MyObject>()))
        .Callback<int, MyObject>((i, obj) => saveObject = obj)
        .Returns("xyzzy");

// Act
// ...

// Assert
// Verify Method was called once only
mock.Verify(c => c.Method(It.IsAny<int>(), It.IsAny<MyObject>()), Times.Once());
// Assert about saveObject
Assert.That(saveObject.TheProperty, Is.EqualTo(2));
ObjectA.Verify(
a=>a.执行(
It.Is(p=>p.Id==7)
)
);

也有一个,但操作的参数是一个没有公共属性的接口。最后用一个单独的方法使用了It.Is(),在这个方法中必须对接口进行一些模拟

ObjectA.Verify(
    a => a.Execute(
        It.Is<Params>(p => p.Id == 7)
    )
);
公共接口iquiry
{
IQuery SetSomeFields(字符串信息);
}
void DoSomeQuerying(操作查询);
mockedObject.Setup(m=>m.DoSomeQuerying(It.Is(q=>MyCheckingMethod(q));
私有布尔MyCheckingMethod(操作查询操作)
{
var mockQuery=new Mock();
mockQuery.Setup(m=>m.SetSomeFields(It.Is(s=>s.MeetsSomeCondition())
调用(mockQuery.Object);
验证(m=>m.SetSomeFields)(It.Is(s=>s.MeetsSomeCondition(),Times.Once)
返回真值
}

谢谢,这对我来说很有意义。我仍然不明白什么时候在安装或验证中指定详细信息。这很让人困惑。目前,我只是在安装中允许任何内容并在验证中指定值。你认为我如何在有多个呼叫时检查消息?客户端接收消息并可以创建多个queueableMessages,它将在多个调用中结束,并且在每个调用中,我必须检查不同的消息。总体而言,我仍在努力进行单元测试,我还不太熟悉它。我不认为有什么神奇的灵丹妙药可以帮助你做到这一点。这需要练习,你会开始变得更好。对我来说,我只知道当我有东西要比较时,以及当我不知道时,指定参数
ObjectA.Verify(
    a => a.Execute(
        It.Is<Params>(p => p.Id == 7)
    )
);
public interface IQuery
{
    IQuery SetSomeFields(string info);
}

void DoSomeQuerying(Action<IQuery> queryThing);

mockedObject.Setup(m => m.DoSomeQuerying(It.Is<Action<IQuery>>(q => MyCheckingMethod(q)));

private bool MyCheckingMethod(Action<IQuery> queryAction)
{
    var mockQuery = new Mock<IQuery>();
    mockQuery.Setup(m => m.SetSomeFields(It.Is<string>(s => s.MeetsSomeCondition())
    queryAction.Invoke(mockQuery.Object);
    mockQuery.Verify(m => m.SetSomeFields(It.Is<string>(s => s.MeetsSomeCondition(), Times.Once)
    return true
}