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