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的具体实现与外部依赖项隔离,那么您的测试将是一个集成测试