如何单元测试SharePoint加载项



我想删除SharePoint依赖项并模拟它们。默认索引操作宽度类似于新的SharePoint加载项模板中的以下内容:

    public ActionResult Index()
    {
        User spUser = null;
        var spContext = SharePointContextProvider.Current.GetSharePointContext(HttpContext);
        using (var clientContext = spContext.CreateUserClientContextForSPHost())
        {
            if (clientContext != null)
            {
                spUser = clientContext.Web.CurrentUser;
                clientContext.Load(spUser, user => user.Title);
                clientContext.ExecuteQuery();
                ViewBag.UserName = spUser.Title;
            }
        }
        return View();
    }

我试图将客户端context打包到适配器中,但不能模拟Web属性:

public interface IClientContext
{
    Web Web { get; }
    void Load<T>(T clientObject, params Expression<Func<T, object>>[] retrievals) where T : ClientObject;
    void ExecuteQuery();
}
public class ClientContextAdapter : IClientContext
{
    private readonly ClientContext _wrappedClient;
    public ClientContextAdapter(ClientContext client)
    {
        _wrappedClient = client;
    }
    public Web Web => _wrappedClient.Web;
    public void Load<T>(T clientObject, params Expression<Func<T, object>>[] retrievals) where T : ClientObject
    {
        _wrappedClient.Load(clientObject, retrievals);
    }
    public void ExecuteQuery()
    {
        _wrappedClient.ExecuteQuery();
    }
}

您如何单元测试您的SharePoint加载项?

找到了一个解决方案,因此SharePoint依赖性可以以以下方式嘲笑。网络也应将其包装到适配器中:

public interface IWeb
{
    User CurrentUser { get; }
}
public class WebAdapter : IWeb
{
    private readonly Web _wrappedClient;
    public WebAdapter(Web client)
    {
        _wrappedClient = client;
    }
    public User CurrentUser => _wrappedClient.CurrentUser;
}

clientContext适配器带有Web适配器内部:

public interface IClientContext
{
    IWeb Web { get; }
    void Load<T>(T clientObject, params Expression<Func<T, object>>[] retrievals) where T : ClientObject;
    void ExecuteQuery();
}
public class ClientContextAdapter : IClientContext
{
    private readonly ClientContext _wrappedClient;
    public ClientContextAdapter(ClientContext client)
    {
        _wrappedClient = client;
    }
    public IWeb Web => new WebAdapter(_wrappedClient.Web);
    public void Load<T>(T clientObject, params Expression<Func<T, object>>[] retrievals) where T : ClientObject
    {
        _wrappedClient.Load(clientObject, retrievals);
    }
    public void ExecuteQuery()
    {
        _wrappedClient.ExecuteQuery();
    }
}

clientcontext依赖性从贫穷男人的依赖注入中删除了:

     IClientContext _clientContext;
    #region Constructors
    public HomeController()
    {
        // Called by MVC
    }
    public HomeController(IClientContext clientContext)
    {
        _clientContext = clientContext;
    }
    #endregion
    [SharePointContextFilter]
    public ActionResult Index()
    {
        if (_clientContext == null)
        {
            var spContext = SharePointContextProvider.Current.GetSharePointContext(HttpContext);
            _clientContext = new ClientContextAdapter(spContext.CreateUserClientContextForSPHost());
        }
        if (_clientContext != null)
        {
            User spUser = _clientContext.Web.CurrentUser;
            _clientContext.Load(spUser, user => user.Title);
            _clientContext.ExecuteQuery();
            ViewBag.UserName = spUser.Title;
        }
        return View();
    }

用量和fluentAssertions的索引动作的单位测试:

[TestClass]
class HomeControllerTests
{
    private HomeController _homeController;
    [TestInitialize]
    public void Init()
    {
        // Arrange
        var user = new User(new ClientContext("http://localhost"), 
            new ObjectPathConstructor(new ClientContext("http://localhost"), string.Empty, null));
        user.Title = "TestUser";
        var mockWeb = new Mock<IWeb>();
        mockWeb.SetupGet(w => w.CurrentUser).Returns(user);
        var mockClient = new Mock<IClientContext>();
        mockClient.SetupGet(c => c.Web).Returns(mockWeb.Object);
        _homeController = new HomeController(mockClient.Object);
    }
    [TestMethod]
    public void Index()
    {
        // Act
        var result = (ViewResult)_homeController.Index();
        // Assert
        result.Should().BeViewResult();
        string userName = result.ViewBag.UserName;
        userName.Should().Be("TestUser");
    }
}

最新更新