2016-12-14 5 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 IWeb 
{ 
    User CurrentUser { get; } 
} 

public class WebAdapter : IWeb 
{ 
    private readonly Web _wrappedClient; 
    public WebAdapter(Web client) 
    { 
     _wrappedClient = client; 
    } 

    public User CurrentUser => _wrappedClient.CurrentUser; 
} 

ClientContext адаптер с веб-адаптера внутри:

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

единичный тест действия индекса с 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"); 
    } 
} 
Смежные вопросы