Я создаю mocking для QueueClient. У меня GetQueueClient в ServiceBus class. Я использую для этого код ниже.
using NUnit.Framework;
using Moq;
[TestFixture]
public sealed class FetchingTest
{
private Mock<IServiceBus> mockIServiceBus;
private Mock<QueueClient> queueClient1;
[TestFixtureSetUp]
public void Setup()
{
this.mockIServiceBus = new Mock<IServiceBus>();
this.queueClient1 = new Mock<QueueClient>();
}
[Test]
public void TestPagingUsesCorrectOffsets()
{
this.mockIServiceBus.Setup(p => p.GetQueueClient(Constants.FetcherQueueName)).Returns(queueClient1.Object); // Getting error here
}
}
Класс служебной шины:
using Microsoft.ServiceBus;
public class ServiceBus : IServiceBus
{
private static readonly string ServiceBusConnectionString =
ConfigurationManager.AppSettings[ConnectionStringNames.ServiceBus];
public QueueClient GetQueueClient(string queueName)
{
return QueueClient.CreateFromConnectionString(ServiceBusConnectionString, queueName);
}
}
Выдает ошибку
Parent does not have a default constructor. The default constructor must be explicitly defined. System.NotSupportedException
Может ли кто-нибудь помочь мне решить эту проблему?
@Nkosi Я пытался использовать его, но не могу импортировать необходимую библиотеку.
Если нет доступа к нему, подумайте о создании собственной абстракции и реализации, которая обертывает фактического клиента.
Только что проверил и интерфейс общедоступный. Почему ты не можешь получить к нему доступ





Ссылаясь на QueueClient Класс
Убедитесь, что вы зависите от абстракций, а не от реализаций, чтобы избежать проблем с реализацией.
public interface IServiceBus {
IQueueClient GetQueueClient(string queueName);
}
public class ServiceBus : IServiceBus {
private static readonly string ServiceBusConnectionString =
ConfigurationManager.AppSettings[ConnectionStringNames.ServiceBus];
public IQueueClient GetQueueClient(string queueName) {
return QueueClient.CreateFromConnectionString(ServiceBusConnectionString, queueName);
}
}
Таким образом, абстракцию можно смоделировать при необходимости при тестировании.
[TestFixture]
public sealed class FetchingTest
{
private Mock<IServiceBus> mockIServiceBus;
private Mock<IQueueClient> queueClient1;
[TestFixtureSetUp]
public void Setup() {
this.mockIServiceBus = new Mock<IServiceBus>();
this.queueClient1 = new Mock<IQueueClient>();
}
[Test]
public void TestPagingUsesCorrectOffsets() {
//Arrange
this.mockIServiceBus
.Setup(_ => _.GetQueueClient(Constants.FetcherQueueName))
.Returns(queueClient1.Object);
//...
}
}
Мы используем Microsoft.ServiceBus.Messaging, поэтому он конфликтует с Microsoft.Azure.ServiceBus.
вместо этого вам следует использовать абстракцию
IQueueClient.