c# - 测试 Exchange Web 服务 API 的最佳策略

标签 c# unit-testing mocking exchangewebservices

我正在开发一个新的 C# 3.5 应用程序,它需要监控 Exchange 邮箱并在收到电子邮件时执行一些操作。我知道微软现在 recommends使用 Exchange Web 服务在 Exchange 服务器上执行操作,所以我决定使用它。

我还找到了 Exchange Web Services Managed API (使用 1.2.1 版)这显然使调用这些 Web 服务的任务变得更加容易。

我的问题是,有人有使用托管 API 创建自动化单元/集成测试的经验吗?

目前我没有 Exchange 服务器,所以我真的很想创建某种模拟(我通常使用 Moq)但是 Microsoft.Exchange.WebServices.Data.ExchangeService 没有实现我可以模拟的任何类型的界面。我的代码全部编码为接口(interface)并专为依赖项注入(inject)而设计,但我想不出抽象出 EWS API 依赖项的好方法。

最佳答案

您可以使用 Facade设计模式并在 EWS 托管 API 之上构建一组类。 Facade 类应该实现一组您自己创建的接口(interface)。这些接口(interface)不应模仿 EWS API,而应仅公开您在应用程序中需要的功能。

您的应用程序中的代码很乐意忘记 EWS。它只会知道您的 Facade 接口(interface),这使您可以在单元测试时使用 Moq stub 或模拟接口(interface)。

例如,如果您需要检索邮箱中的所有项目,您可以使用一个名为 GetItems 的方法创建一个 IMailBox 接口(interface):

public interface IMailBox
{
    IEnumerable<MailItem> GetItems(string smtpAddress, WellknownFolderName folder);
}

对于您的应用程序,您将创建一个实现此接口(interface)的类。您可以使用您最喜欢的 DI 框架在您的代码中注入(inject)该类。

public class MailBox : IMailBox
{
    public IEnumerable<MailItem> GetItems(string smtpAddress, WellknownFolderName folder)
    {
        var service = new ExchangeService();
        // Some code here...
    }
}

关于c# - 测试 Exchange Web 服务 API 的最佳策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12563499/

相关文章:

python - 覆盖Python模块中的 "private"方法

c# - 如何使用 MOQ 框架在 c# 中模拟静态方法?

java - 如何使用 Mockito 消除外部依赖?

c# - "<<"在C#中代表什么?

java - 如何使用 junit ExpectedException?

javascript - Jasmine 的 spy throw 不是函数错误

unit-testing - 使用 jest 和 vue-test-utils2 在 vue3 typescript 单元测试中模拟 axios (已解决)

c# - 通用存储库 - 表达式数组 <Func<T, TProperty>> 错误

c# - unity InputField OnValueChanged事件显示InputField.text少一个字符

c# - 接受通过ajax在Post请求中发送的Web API(C#)中的ArrayBuffer(不使用表单)