Довольно сложно узнать что-либо о Sitecore без предоставления электронной почты и прохождения рекламной кампании, поэтому я просто предоставлю общий подход к тому, как сделать что-то подобное.
Прежде всего, выПредположим, что API Sitecore гарантированно работает - т.е. это фреймворк - и вы не тестируете модуль it .Вы должны тестировать свои взаимодействия с ним.
Затем загрузите MOQ и прочитайте краткий обзор о том, как его использовать .Это моя любимая насмешливая основа.Не стесняйтесь использовать другие фреймворки, если хотите.
Надеемся, что Sitecore API предоставит вам возможность создавать объекты данных, не имея дело с постоянством, то есть просто создавать новый экземпляр того, что вас интересует.Вот мой воображаемый API:
public class Post {
public string Body {get;set;}
public DateTime LastModified {get;set;}
public string Title {get;set;}
}
public interface ISiteCorePosts {
public IEnumerable<Post> GetPostsByUser(int userId);
}
В этом случае модульное тестирование должно быть довольно простым.С помощью Dependency Injection вы можете внедрить интерфейсы SiteCore в свой компонент, а затем выполнить его модульное тестирование.
public class MyPostProcessor {
private readonly ISiteCorePosts m_postRepository;
public MyPostProcessor(ISiteCorePosts postRepository) {
m_postRepository = postRepository;
}
public void ProcessPosts(int userId) {
var posts = m_postRepository.GetPostsByUser(userId);
//do something with posts
}
}
public class MyPostProcessorTest {
[TestMethod]
ProcessPostsShouldCallGetPostsByUser() {
var siteCorePostsMock = new Mock<ISiteCorePosts>();
//Sets up the mock to return a list of posts when called with userId = 5
siteCorePostsMock.Setup(m=>m.GetPostsByUser(5)).Returns(new List<Post>{/*fake posts*/});
MyPostProcessor target = new MyPostProcessor(siteCorePostsMock.Object);
target.ProcessPosts(5);
//Verifies that all setups are called
siteCorePostsMock.VerifyAll();
}
}
Если ISiteCorePosts
на самом деле не является интерфейсом и представляет собой конкретный класс, методы которогоне являются виртуальными и, следовательно, не могут быть поддельными, вам нужно будет использовать шаблон фасада , чтобы обернуть взаимодействие SiteCore, чтобы сделать его более удобным для тестирования.
public class SiteCorePostsFacade {
SiteCorePosts m_Posts = new SiteCorePosts();
//important - make this method virtual so it can be mocked without needing an interface
public virtual IEnumerable<Post> GetPostsByUser(int userId) {
return m_Posts.GetPostsByUser(userId);
}
}
Затем вы переходите к использованию SiteCorePostsFacade
как будто это интерфейс в предыдущем примере.Хорошая особенность MOQ заключается в том, что он позволяет имитировать конкретные классы с помощью виртуальных методов, а не только интерфейсов.
При таком подходе вы должны иметь возможность вводить все виды данных в свое приложение для проверки всех взаимодействий с SiteCore.API.