2016-12-14 3 views
0

Ich möchte die SharePoint-Abhängigkeiten entfernen und verspotten. Der Standardindex Aktion loos wie die folgenden in der neuen Sharepoint-Add-In-Vorlage:Wie Unit-Test ein SharePoint-Add-in?

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

habe ich versucht, die Clientcontext in einen Adapter zu verpacken, kann aber nicht Web-Property-verspotten:

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

Wie Testen Sie Ihre SharePoint-Add-Ins einzeln?

Antwort

2

Eine Lösung gefunden, sodass die SharePoint-Abhängigkeit auf folgende Weise mokiert werden kann.

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-Adapter mit Webadapter innen:

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 Abhängigkeit entfernt von Homecontroller mit armen Mannes Dependency Injection:

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

Das Web sollte auch in einen Adapter verpackt werden Unit-Test der Index-Aktion mit Moq und 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"); 
    } 
}