[英]Mocking SDK client which has chained methods
我需要对Test1()进行单元测试,如下所示,并且必须模拟具有 http 调用的 msgraph-sdk创建事件。
我是 mocking Request()和AddAsync( )方法,但在 Act 上得到了 null 值。
mocking对 CreateAsync 进行单元测试的正确方法是什么?
public interface IApiClient
{
Task<Event> CreateAsync(EventItem eventItem);
}
public class ApiClient : IApiClient
{
private readonly IGraphServiceClient _graphServiceClient;
public ApiClient(IGraphServiceClient graphServiceClient)
{
_graphServiceClient = graphServiceClient;
}
public async Task<Event> CreateAsync(EventItem eventItem)
{
var item = new Event
{
Subject = eventItem.Subject
};
return await _graphServiceClient.Users[eventItem.UserInfo.Id].Events
.Request()
.AddAsync(item);
}
}
public class ApiClientTest
{
private Mock<IGraphServiceClient> _graphServiceClientMock;
private IApiClient _apiClient;
private Mock<IUserEventsCollectionRequest> _mockUserEventsCollectionRequest;
private EventItem _eventItem;
[SetUp]
public async System.Threading.Tasks.Task SetupAsync()
{
var x = new Microsoft.Graph.Event()
{
Subject = "123"
};
_graphServiceClientMock = new Mock<IGraphServiceClient>();
_mockUserEventsCollectionRequest = new Mock<IUserEventsCollectionRequest>();
_apiClient = new IApiClient(_graphServiceClientMock.Object);
_graphServiceClientMock.Setup(g => g.Users[_eventItem.UserInfo.Id].Events
.Request())
.Returns(
_mockUserEventsCollectionRequest.Setup(g => g.AddAsync(x))
.ReturnsAsync(new Event { Id = "asaasaS" });
}
[Test]
public async Task Test1()
{
// Act
var newEvent = await _apiClient.CreateAsync(_eventItem);
// Assert
Assert.NotNull(newEvent);
Assert.AreEqual("asaasaS", newEvent.Id);
}
}
我是 mocking Request()和AddAsync( )方法,但在 Act 上得到了 null 值。
mocking对 CreateAsync 进行单元测试的正确方法是什么?
有很多 mocking 供您测试,所以也许您应该问问自己是否值得。 如果答案是肯定的,那么这里是一个示例,您可以如何做到这一点(我将所有内容都放入Test1
方法并跳过[SetUp]
方法以获得更好的可见性)。
public class ApiClientTest
{
[Test]
public async Task Test1()
{
// Arrange
Event @event = new Event { Subject = "Subject", Id = "123" };
EventItem eventItem = new EventItem { Subject = @event.Subject, UserInfo = new UserInfo { Id = @event.Id } };
Mock<IUserEventsCollectionRequest> mockUserEventsCollectionRequest = new Mock<IUserEventsCollectionRequest>();
mockUserEventsCollectionRequest.Setup(x => x.AddAsync(It.IsAny<Event>())).ReturnsAsync(@event);
Mock<IUserEventsCollectionRequestBuilder> mockUserEventsCollectionRequestBuilder = new Mock<IUserEventsCollectionRequestBuilder>();
mockUserEventsCollectionRequestBuilder.Setup(x => x.Request()).Returns(mockUserEventsCollectionRequest.Object);
Mock<IUserRequestBuilder> userRequestBuilder = new Mock<IUserRequestBuilder>();
userRequestBuilder.Setup(x => x.Events).Returns(mockUserEventsCollectionRequestBuilder.Object);
Mock<IGraphServiceClient> graphServiceClient = new Mock<IGraphServiceClient>();
graphServiceClient.Setup(x => x.Users[It.IsAny<string>()]).Returns(userRequestBuilder.Object);
IApiClient apiClient = new ApiClient(graphServiceClient.Object);
// Act
Event newEvent = await apiClient.CreateAsync(eventItem);
// Assert
Assert.NotNull(newEvent);
Assert.AreEqual(@event.Id, newEvent.Id);
Assert.AreEqual(@event.Subject, newEvent.Subject);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.