Я все еще учусь использовать MSTest и Moq для автоматического модульного тестирования в своем приложении. Я успешно издевался над кодом и запустил его. Это показывает, что тесты пройдены, но покрытие кода 0%. Это мой код ниже. Что нужно изменить, чтобы охват кода стал 100%.

Я знаю, что этот вопрос задавали пару раз раньше, но, похоже, мне ничего не помогает. Так что кто-нибудь может подсказать мне, что я делаю не так

Любая помощь приветствуется. Спасибо.

PS: Я использую Sonarcube для определения покрытия кода.

using Moq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Threading.Tasks;
using System.Diagnostics.CodeAnalysis;

namespace MyNameSpace
{
    [TestClass]
    public class ApplicationTest
    {
        readonly Helper moqHelper = new Helper();
        [TestMethod()]
        public void GetDataFromDataBaseMoq()
        {
            Task<bool> returnValue;
            Mock<Application> mockType = new Mock<Application>();
            mockType.CallBase = true;
            mockType.Setup(x => x.GetDataFromDataBase()).Returns(returnValue = moqHelper.GetDataFromDataBaseMoq());
            if (returnValue.Result)
            {
                Assert.IsTrue(true);
            }
            else
            {
                Assert.Fail();
            }
        }
    }

    [ExcludeFromCodeCoverage]
    class Helper
    {
        internal async Task<bool> GetDataFromDataBaseMoq()
        {
            bool returnValue = true;
            return returnValue;
        }
    }
    public class Application : IApplication
    {
        public virtual async Task<bool> GetDataFromDataBase()
        {
            //if data retrive successfull, return true, else false
            return true;
        }
    }
    public interface IApplication
    {
        Task<bool> GetDataFromDataBase();
    }
}
0
CrazyCoder 14 Июн 2018 в 10:21

1 ответ

Лучший ответ

Вы не тестируете код своего приложения, вы тестируете свой макет. Вы могли убедиться в этом, установив точку останова в Application.GetDataFromDataBase() и отладив свой тест; вы бы увидели, что в него не попадут.

Вам нужно только имитировать зависимости, если они есть. Итак, перепишите свой тест, чтобы действительно вызвать ваш код:

[TestMethod]
public async Task GetDataFromDataBase_Returns_True()
{
    // Arrange
    IApplication classUnderTest = new Application();

    // Act
    var result = await classUnderTest.GetDataFromDataBase();

    // Assert
    Assert.IsTrue(result);
}

И вы увидите, что потребность во всех моковах и помощниках отпадает.

4
CodeCaster 14 Июн 2018 в 07:25