Unit testing 对存储库进行单元测试—它看起来正确吗?
所以,这是我第一次尝试单元测试,我只是想知道我是否做得对,因为这感觉像是在愚弄自己。所以,欢迎提出任何建议和/或反馈,谢谢:Unit testing 对存储库进行单元测试—它看起来正确吗?,unit-testing,repository,Unit Testing,Repository,所以,这是我第一次尝试单元测试,我只是想知道我是否做得对,因为这感觉像是在愚弄自己。所以,欢迎提出任何建议和/或反馈,谢谢: [TestClass] public class ArticleRepositoryTest { IArticleRepository _articleRepository; const string drawingNumber = "drawingNumber"; const string searchString = "searchStrin
[TestClass]
public class ArticleRepositoryTest
{
IArticleRepository _articleRepository;
const string drawingNumber = "drawingNumber";
const string searchString = "searchString";
const string articleDescription = "I have a description";
ArticleDTO articleDTO = new ArticleDTO() { DrawingNumber = drawingNumber };
[TestInitialize]
public void Initialize()
{
//Arange
_articleRepository = A.Fake<IArticleRepository>();
A.CallTo(() => _articleRepository.GetAll()).Returns(new List<ArticleDTO>());
A.CallTo(() => _articleRepository.GetOne(drawingNumber)).Returns(new ArticleDTO { DrawingNumber = drawingNumber });
A.CallTo(() => _articleRepository.GetSearch(searchString)).Returns(new List<ArticleDTO>());
A.CallTo(() => _articleRepository.SaveData(articleDTO)).Invokes(call => { _articleRepository.GetAll().Result.Add(articleDTO); });
A.CallTo(() => _articleRepository.Edit(articleDTO)).Invokes(call => _articleRepository.GetOne(drawingNumber).Result.ArticleDescr = articleDescription);
}
[TestMethod]
public void Article_GetAll_ReturnsListOfArticleDTO()
{
//Arange - Done in the Initialize() method.
//Act
var articlesDTO = _articleRepository.GetAll();
//Assert
Assert.IsInstanceOfType(articlesDTO, typeof(Task<ICollection<ArticleDTO>>));
}
[TestMethod]
public void Article_GetOneByDrawingNumber_ReturnsArticleDTO()
{
//Arange - Done in the Initialize() method.
//Act
var articleDTO = _articleRepository.GetOne(drawingNumber);
//Assert
Assert.IsInstanceOfType(articleDTO, typeof(Task<ArticleDTO>));
Assert.AreEqual(drawingNumber, articleDTO.Result.DrawingNumber);
}
[TestMethod]
public void Article_GetSearch_ReturnsListOfArticleDTO()
{
//Arange - Done in the Initialize() method.
//Act
var articlesDTO = _articleRepository.GetSearch(searchString);
//Assert
Assert.IsInstanceOfType(articlesDTO, typeof(Task<ICollection<ArticleDTO>>));
}
[TestMethod]
public async Task Article_SaveData_SavesTheArticleToTheDatabase()
{
//Arange - the repository and the articleDTO variable is set up in the Initialize() method.
//Act
_articleRepository.SaveData(articleDTO);
//Assert
A.CallTo(() => _articleRepository.SaveData(articleDTO)).MustHaveHappened();
var list = await _articleRepository.GetAll();
Assert.AreEqual(1, list.Count);
}
[TestMethod]
public void Article_Edit_EditsAnInstanceOfArticle()
{
//Arange - the repository and the articleDTO variable is set up in the Initialize() method.
//Act
articleDTO.ArticleDescr = articleDescription;
_articleRepository.Edit(articleDTO);
var x = _articleRepository.GetOne(drawingNumber).Result.ArticleDescr;
//Assert
A.CallTo(() => _articleRepository.Edit(articleDTO)).MustHaveHappened();
Assert.AreEqual(articleDescription, x);
}
另外,我是否也应该构建UnitOfWork类?你能给出一些论据吗?谢谢。您做了UTs测试,但没有人测试存储库。每个UT都会验证FakeiTasy是否正常工作。请添加IArticleRepository的具体实现,它是您想要在testCUT下测试的类,但这不是一个集成测试吗?很抱歉,我的回答迟了,在hollyday,我确实在这附近的某个地方找到了一些关于它的东西,但我不能再找到它来发布在这里,长话短说,正如你也指出的,我在愚弄自己。单元测试存储库没有任何意义,因为没有什么可以伪造的,所以是的,正如您所提到的,我应该为存储库编写集成测试,并为依赖它的任何东西编写单元测试。没关系,我希望您的假期很棒!当您对一个方法执行UT时,您正在模拟一种情况,然后验证您的单元的行为是否完全符合您的预期。在您的情况下,您根本没有单元,您使用FakeiTesy覆盖单元行为,在伪对象上模拟行为,然后验证该行为是否发生。使用IArticleRepository的具体实现并不意味着您的测试是集成测试。如果您不将IArticleRepository的具体实现与外部依赖项隔离,那么您的测试将是一个集成测试