2016-12-14 95 views
0

我想删除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(); 
    } 

我试图打包ClientContext插入适配器,但不能模拟出的网络媒体:

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加载项?

回答

2

找到了一个解决方案,因此SharePoint依赖可以通过以下方式嘲笑。网站应装入适配器以及:

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依赖从HomeController中有穷人的依赖注入去除:

 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(); 
    } 

的里面网络适配器

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适配器指数行为与Moq和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"); 
    } 
}