gpt4 book ai didi

unit-testing - 在单元测试中,您是否验证和断言?

转载 作者:行者123 更新时间:2023-12-03 15:10:00 25 4
gpt4 key购买 nike

我在我的单元测试项目中使用 Moq。我在网上看到的大多数单元测试示例都以 someMock.VerifyAll(); 结尾我想知道在VerifyAll()之后断言是否可以.例如,

//Arrange
var student = new Student{Id = 0, Name="John Doe", IsRegistered = false};
var studentRepository = new Mock<IStudentRepository>();
var studentService= new StudentService(studentRepository.Object);

//Act
studentService.Register(student); //<-- student.IsRegistered = true now.

//Verify and assert
studentRepository.VerifyAll();
Assert.IsTrue(student.IsRegistered);

任何想法?谢谢你。

最佳答案

不,您不应该同时使用两者 在大多数情况下(总是有异常(exception))。这样做的原因是,出于可维护性、可读性和其他一些原因,您应该在测试中只测试一件事。因此,它应该在您的测试中使用 Verify(VerifyAll) 或 Assert,并相应地命名您的测试。

看看 Roy Osherove 关于它的文章:

http://osherove.com/blog/2005/4/3/a-unit-test-should-test-only-one-thing.html
VerifyAll用于确保调用某些方法以及调用次数。您使用 mocks为了那个原因。
Assert用于验证从您正在测试的方法返回的结果。您使用 Stubs为了那个原因。

Martin fowler 有一篇很棒的文章解释了模拟和 stub 之间的区别。如果您了解它,您将更好地了解其中的区别。

http://martinfowler.com/articles/mocksArentStubs.html

更新:按照下面评论中的要求,使用 Moq 的模拟 vs stub 示例。我使用过验证,但您也可以使用 VerifyAll。

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
...

[TestClass]
public class UnitTest1
{
/// <summary>
/// Test using Mock to Verify that GetNameWithPrefix method calls
/// Repository GetName method once when Id is greater than Zero
/// </summary>
[TestMethod]
public void GetNameWithPrefix_IdIsTwelve_GetNameCalledOnce()
{
// Arrange
var mockEntityRepository = new Mock<IEntityRepository>();
mockEntityRepository.Setup(m => m.GetName(It.IsAny<int>()));

var entity = new EntityClass(mockEntityRepository.Object);
// Act
var name = entity.GetNameWithPrefix(12);
// Assert
mockEntityRepository.Verify(
m => m.GetName(It.IsAny<int>()), Times.Once);
}

/// <summary>
/// Test using Mock to Verify that GetNameWithPrefix method
/// doesn't calls Repository GetName method when Id is Zero
/// </summary>
[TestMethod]
public void GetNameWithPrefix_IdIsZero_GetNameNeverCalled()
{
// Arrange
var mockEntityRepository = new Mock<IEntityRepository>();
mockEntityRepository.Setup(m => m.GetName(It.IsAny<int>()));
var entity = new EntityClass(mockEntityRepository.Object);
// Act
var name = entity.GetNameWithPrefix(0);
// Assert
mockEntityRepository.Verify(
m => m.GetName(It.IsAny<int>()), Times.Never);
}

/// <summary>
/// Test using Stub to Verify that GetNameWithPrefix method
/// returns Name with a Prefix
/// </summary>
[TestMethod]
public void GetNameWithPrefix_IdIsTwelve_ReturnsNameWithPrefix()
{
// Arrange
var stubEntityRepository = new Mock<IEntityRepository>();
stubEntityRepository.Setup(m => m.GetName(It.IsAny<int>()))
.Returns("Stub");
const string EXPECTED_NAME_WITH_PREFIX = "Mr. Stub";
var entity = new EntityClass(stubEntityRepository.Object);
// Act
var name = entity.GetNameWithPrefix(12);
// Assert
Assert.AreEqual(EXPECTED_NAME_WITH_PREFIX, name);
}
}

public class EntityClass
{
private IEntityRepository _entityRepository;
public EntityClass(IEntityRepository entityRepository)
{
this._entityRepository = entityRepository;
}
public string Name { get; set; }
public string GetNameWithPrefix(int id)
{
string name = string.Empty;
if (id > 0)
{
name = this._entityRepository.GetName(id);
}
return "Mr. " + name;
}
}

public interface IEntityRepository
{
string GetName(int id);
}

public class EntityRepository:IEntityRepository
{
public string GetName(int id)
{
// Code to connect to DB and get name based on Id
return "NameFromDb";
}
}

关于unit-testing - 在单元测试中,您是否验证和断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20863180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com