【问题标题】:Unit Testing Graph SDK PageIterator单元测试图 SDK PageIterator
【发布时间】:2021-02-18 21:38:13
【问题描述】:

我正在创建一个使用 Microsoft Graph SDK 的服务,该服务具有从 Active Directory 检索所有应用程序的方法。最初我只考虑了一个页面来编写该方法,并成功地模拟了单元测试中的调用,如下所示。

方法

public async Task<IList<Application>> GetAllApplicationsAsync()
{
    var applicationFirstPage = await _graphServiceClient.Applications
            .Request()
            .GetAsync();

    return applicationFirstPage;
}

单元测试

[Test]
public async Task GetAllApplicationsAsync_NoApplications_ReturnsEmptyAsync()
{
    // Arrange
    var graphServiceClientMock = new Mock<IGraphServiceClient>();

    // Create an empty page of applications
    GraphServiceApplicationsCollectionPage page = new GraphServiceApplicationsCollectionPage { };

    graphServiceClientMock.Setup(m => m.Applications.Request().GetAsync()).ReturnsAsync(() => page);
    var graphClient = new GraphClient(graphServiceClientMock.Object);

    // Act
    var apps = await graphClient.GetAllApplicationsAsync();

    // Assert
    Assert.That(apps, Is.Empty);
}

然后我继续从默认查询扩展该方法并遍历所有页面以获取所有应用程序的列表。我使用了PageIterator,如docs 中所述。当我去更新单元测试时,我一直在努力调整它们以包含PageIterator

调用 await pageIterator.IterateAsync(); 会引发 null ref 异常,我想不出我将如何模拟或绕过它。

扩展方法

public async Task<IList<Application>> GetAllApplicationsAsync()
{
    var applicationFirstPage = await _graphServiceClient.Applications
            .Request()
            .GetAsync();

    List<Application> applications = new List<Application>();
    var pageIterator = PageIterator<Application>
        .CreatePageIterator(_graphServiceClient, applicationFirstPage, (a) =>
        {
            applications.Add(a);
            return true;
        });

    await pageIterator.IterateAsync();

    return applications;
}

对于如何通过单元测试涵盖此方法的任何帮助或建议,我将不胜感激。提前致谢。

【问题讨论】:

    标签: c# unit-testing microsoft-graph-api microsoft-graph-sdks


    【解决方案1】:

    pageIterator.IterateAsync()内部访问page.AdditionalDataAdditionalDataGraphServiceApplicationsCollectionPage的构造函数中没有初始化。

    你必须初始化AdditionalData

    GraphServiceApplicationsCollectionPage page = new GraphServiceApplicationsCollectionPage 
    {
        AdditionalData = new Dictionary<string, object>()
    };
    

    PageIterator

    【讨论】:

    • 在哪里使用此代码?谷歌搜索 GraphServiceApplicationsCollectionPage 时,只会弹出这个答案
    • 这对我有帮助,谢谢!在我的情况下,我试图通过使用 $expand 子句拉入的 IAccessPackageCatalogAccessPackageCollectionPage 来 IterateAsync() 。即 graphClient.IdentityGovernance.EntitlementManagement.AccessPackageCatalogs.Request().Filter($"displayname eq '{catalog.DisplayName}'&$expand=accessPackages").GetAsync();然后在其中一个目录的 AccessPackages 属性上创建一个 PageIterator。这避免了崩溃:graphCatalog.AccessPackages.AdditionalData = new Dictionary().
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 2013-11-26
    相关资源
    最近更新 更多