英文:
how to set body for mock of ServiceBusReceivedMessage
问题
I am trying to create mock for ServiceBusReceivedMessage with the body. How to do it?
我正在尝试为ServiceBusReceivedMessage创建mock,并设置消息体。该如何做?
I have data variable which I want to set as message body, how to do it?
我有一个名为data的变量,我想将其设置为消息体,该如何操作?
var data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(eventData));
var mockMessage = new Mock<ServiceBusReceivedMessage>();
var messageBody = new BinaryData(data);
mockMessage.Setup(x => x.Body).Returns(messageBody);
var message = mockMessage.Object;
以上是您提供的代码部分的翻译。
英文:
I am trying to create mock for ServiceBusReceivedMessage with the body. How to do it?
I have data variable which I want to set as message body, how to do it?
var data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(eventData));
var message = new Mock<ServiceBusReceivedMessage>().Object;
//message.Body;
I tried below code, compile no error, but while running giving error:
> System.NotSupportedException : Unsupported expression: x => x.Body
Non-overridable members (here: ServiceBusReceivedMessage.get_Body) may not be used in setup / verification expressions.
var mockMessage = new Mock<ServiceBusReceivedMessage>();
var messageBody = new BinaryData(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(eventData)));
mockMessage.Setup(x => x.Body).Returns(new BinaryData(messageBody));
var message = mockMessage.Object;
What's wrong here?
答案1
得分: 2
I understand your request. Here is the translated content:
我理解您的要求。以下是翻译好的部分:
从我的理解来看,您想要创建一个具有特定数据的类实例,我建议您使用Nuget存储中的AutoFixture。
示例:
var fixture = new Fixture();
var messageBody = new BinaryData(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(eventData)));
var mockedServiceBusReceivedMessage = fixture
.Build<ServiceBusReceivedMessage>()
.With(e => e.Body, messageBody)
.Create();
如果您想要避免为其他属性生成自动数据,请在.Create()之前添加.OmitAutoProperties()。
如果您想要在ServiceBusReceivedMessage中使用Moq,首先您应该为您的类创建一个接口:
public interface IServiceBusReceivedMessage
{
BinaryData Body { get; }
}
然后将您的类替换为该接口:
public class ServiceBusReceivedMessage : IServiceBusReceivedMessage
{
BinaryData Body { get; set; }
}
然后,您可以使用IServiceBusReceivedMessage为Body设置模拟响应,就像您的示例中一样。但我怀疑您是否需要从BinaryData构造BinaryData,所以可能应该是:
var mockMessage = new Mock<IServiceBusReceivedMessage>();
var messageBody = new BinaryData(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(eventData)));
mockMessage.Setup(x => x.Body).Returns(messageBody);
var message = mockMessage.Object;
也许我在这里说得很明显,但仍然会记录下来:
在所有需要ServiceBusReceivedMessage参数的地方,应该将其更改为IServiceBusReceivedMessage,以便接受这个新的模拟对象。
英文:
From what I understand, you want to create an instance of a class with specific data in it, for which I would recommend to use AutoFixture from Nuget store
Example:
var fixture = new Fixture();
var messageBody = new BinaryData(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(eventData)));
var mockedServiceBusReceivedMessage = fixture
.Build<ServiceBusReceivedMessage>()
.With(e => e.Body, messageBody)
.Create();
If you want to avoid generating automatic data for other properties, add .OmitAutoProperties() before .Create().
If you want to use Moq for ServiceBusReceivedMessage, first you should create an interface for your class:
public interface IServiceBusReceivedMessage
{
BinaryData Body { get; }
}
And then substitute your class to this interface:
public class ServiceBusReceivedMessage : IServiceBusReceivedMessage
{
BinaryData Body { get; set; }
}
Then you could use IServiceBusReceivedMessage to setup mocked response for Body as in your example, but I doubt that you need to construct BinaryData from BinaryData, so it would probably be:
var mockMessage = new Mock<IServiceBusReceivedMessage>();
var messageBody = new BinaryData(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(eventData)));
mockMessage.Setup(x => x.Body).Returns(messageBody);
var message = mockMessage.Object;
And maybe I'm stating obvious here, but still will note this down:
Everywhere where there's ServiceBusReceivedMessage parameter, it should be changed to IServiceBusReceivedMessage for this new mocked object to be accepted.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论