测试通过但代码覆盖率为 0%
Tests passed but code coverage is 0%
我仍在学习使用 MSTest 和 Moq 在我的应用程序中进行自动化单元测试。我已经成功地模拟了代码并 运行 它。它显示测试已通过,但代码覆盖率为 0%。这是我的代码 below.What 需要更改以便代码覆盖率变为 100%。
我知道这个问题已经被问过几次了,但似乎没有任何帮助me.So任何人都可以告诉我我做错了什么。
任何帮助都是高度appreciated.Thanks。
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();
}
}
您不是在测试您的应用程序代码,而是在测试您的模拟。您可以通过在 Application.GetDataFromDataBase()
中设置断点并调试您的测试来看到这一点;你会看到它不会被击中。
您只需要模拟依赖项(如果有)。因此,重写您的测试以实际调用您的代码:
[TestMethod]
public async Task GetDataFromDataBase_Returns_True()
{
// Arrange
IApplication classUnderTest = new Application();
// Act
var result = await classUnderTest.GetDataFromDataBase();
// Assert
Assert.IsTrue(result);
}
您会发现不再需要所有模拟和助手。
我仍在学习使用 MSTest 和 Moq 在我的应用程序中进行自动化单元测试。我已经成功地模拟了代码并 运行 它。它显示测试已通过,但代码覆盖率为 0%。这是我的代码 below.What 需要更改以便代码覆盖率变为 100%。
我知道这个问题已经被问过几次了,但似乎没有任何帮助me.So任何人都可以告诉我我做错了什么。
任何帮助都是高度appreciated.Thanks。
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();
}
}
您不是在测试您的应用程序代码,而是在测试您的模拟。您可以通过在 Application.GetDataFromDataBase()
中设置断点并调试您的测试来看到这一点;你会看到它不会被击中。
您只需要模拟依赖项(如果有)。因此,重写您的测试以实际调用您的代码:
[TestMethod]
public async Task GetDataFromDataBase_Returns_True()
{
// Arrange
IApplication classUnderTest = new Application();
// Act
var result = await classUnderTest.GetDataFromDataBase();
// Assert
Assert.IsTrue(result);
}
您会发现不再需要所有模拟和助手。