gpt4 book ai didi

c# - 如何模拟 Microsoft Graph API SDK 客户端?

转载 作者:行者123 更新时间:2023-11-30 21:36:27 26 4
gpt4 key购买 nike

我在我的项目中使用了 Microsoft Graph SDK 来调用图形 API,为此我需要使用 GraphServiceClient。要使用 GraphServiceClient,我必须添加一些辅助类,其中 SDKHelper 是一个具有 GetAuthenticatedClient() 方法的静态类。由于被测方法与静态的 SDKHelper 紧密耦合,因此我创建了一个服务类并注入(inject)了依赖项。

下面是 Controller 和方法,

public class MyController
{
private IMyServices _iMyServices { get; set; }

public UserController(IMyServices iMyServices)
{
_iMyServices = iMyServices;
}
public async Task<HttpResponseMessage> GetGroupMembers([FromUri]string groupID)
{
GraphServiceClient graphClient = _iMyServices.GetAuthenticatedClient();
IGroupMembersCollectionWithReferencesPage groupMembers = await _iMyServices.GetGroupMembersCollectionWithReferencePage(graphClient, groupID);
return this.Request.CreateResponse(HttpStatusCode.OK, groupMembers, "application/json");
}
}

服务等级,

public class MyServices : IMyServices
{
public GraphServiceClient GetAuthenticatedClient()
{
GraphServiceClient graphClient = new GraphServiceClient(
new DelegateAuthenticationProvider(
async (requestMessage) =>
{
string accessToken = await SampleAuthProvider.Instance.GetAccessTokenAsync();
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", accessToken);
requestMessage.Headers.Add("Prefer", "outlook.timezone=\"" + TimeZoneInfo.Local.Id + "\"");
}));
return graphClient;
}

public async Task<IGraphServiceGroupsCollectionPage> GetGraphServiceGroupCollectionPage(GraphServiceClient graphClient)
{
return await graphClient.Groups.Request().GetAsync();
}
}

我在为上述服务类方法编写单元测试用例时遇到挑战,下面是我的单元测试代码:

public async Task GetGroupMembersCollectionWithReferencePage_Success()
{
GraphServiceClient graphClient = GetAuthenticatedClient();
IGraphServiceGroupsCollectionPage groupMembers = await graphClient.Groups.Request().GetAsync();

Mock<IUserServices> mockIUserService = new Mock<IUserServices>();
IGraphServiceGroupsCollectionPage expectedResult = await mockIUserService.Object.GetGraphServiceGroupCollectionPage(graphClient);
Assert.AreEqual(expectedResult, groupMembers);
}

在上面的测试用例中,第 4 行抛出异常 -消息:“Connect3W.UserMgt.Api.Helpers.SampleAuthProvider”的类型初始值设定项引发异常。内部异常消息:值不能为空。参数名称:格式

谁能建议我如何使用最小起订量来模拟上面的代码或任何其他方法来为此完成测试用例?

最佳答案

不要 mock 你不拥有的东西。 GraphServiceClient 应被视为第 3 方依赖项,并应封装在您控制的抽象后面

您尝试这样做,但仍然泄露实现问题。

服务可以简化为

public interface IUserServices {

Task<IGroupMembersCollectionWithReferencesPage> GetGroupMembers(string groupID);

}

和实现

public class UserServices : IUserServices {
GraphServiceClient GetAuthenticatedClient() {
var graphClient = new GraphServiceClient(
new DelegateAuthenticationProvider(
async (requestMessage) =>
{
string accessToken = await SampleAuthProvider.Instance.GetAccessTokenAsync();
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", accessToken);
requestMessage.Headers.Add("Prefer", "outlook.timezone=\"" + TimeZoneInfo.Local.Id + "\"");
}));
return graphClient;
}

public Task<IGroupMembersCollectionWithReferencesPage> GetGroupMembers(string groupID) {
var graphClient = GetAuthenticatedClient();
return graphClient.Groups[groupID].Members.Request().GetAsync();
}
}

这也会导致 Controller 被简化

public class UserController : ApiController {
private readonly IUserServices service;

public UserController(IUserServices myServices) {
this.service = myServices;
}

public async Task<IHttpActionResult> GetGroupMembers([FromUri]string groupID) {
IGroupMembersCollectionWithReferencesPage groupMembers = await service.GetGroupMembers(groupID);
return Ok(groupMembers);
}
}

现在对于 Controller 的测试,您可以轻松地模拟抽象以按预期运行,以便完成测试,因为 Controller 与 GraphServiceClient 第 3 方依赖项完全分离,并且 Controller 可以进行隔离测试。

[TestClass]
public class UserControllerShould {
[TestMethod]
public async Task GetGroupMembersCollectionWithReferencePage_Success() {
//Arrange
var groupId = "12345";
var expectedResult = Mock.Of<IGroupMembersCollectionWithReferencesPage>();
var mockService = new Mock<IUserServices>();
mockService
.Setup(_ => _.GetGroupMembers(groupId))
.ReturnsAsync(expectedResult);

var controller = new UserController(mockService.Object);

//Act
var result = await controller.GetGroupMembers(groupId) as System.Web.Http.Results.OkNegotiatedContentResult<IGroupMembersCollectionWithReferencesPage>;

//Assert
Assert.IsNotNull(result);
var actualResult = result.Content;
Assert.AreEqual(expectedResult, actualResult);
}
}

关于c# - 如何模拟 Microsoft Graph API SDK 客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48208031/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com