gpt4 book ai didi

c# - 依赖私有(private)方法测试公共(public)方法的方法

转载 作者:行者123 更新时间:2023-11-29 05:36:24 24 4
gpt4 key购买 nike

我正在尝试向遗留代码中添加测试,当我开始添加代码时,我感觉出了点问题。

在下面的代码中,公共(public)方法 RegisterChange 调用两个私有(private)方法来:

  1. 获取要存储的对象
  2. 存储对象
public class ChangeService {

IRepository repository;

public ChangeService(IRepository repository){
this.repository = repository;
}

public bool RegisterChange( int entityId ){
var entity = GetParsedEntity( entityId );
SaveEntity( entity );
return true;
}

private Entity GetParsedEntity( int id ) {
var entity = repository.GetEntityById( id );
return new Entity{ Name = entity.Name };
}

private void SaveEntity( Entity entity ) {
repository.Save( Entity );
}
}

public class ChangeServiceFact(){

[Fact]
public void When_valid_entity__Should_save_entity(){

var mock = new Mock<IRepository>();
var service = new ChangeService(mock.object);

var result = service.RegisterChange( 0 );

Assert.True(result);
}
}

因此,当我模拟存储库时,我必须去检查私有(private)方法的代码以了解要模拟哪些操作。

我在这种方法中看到的问题是,因为代码不仅测试测试对象(公共(public)方法)而且测试私有(private)方法,所以通过查看测试对象(公共(public)方法)。

如果稍后有人决定修改一个私有(private)方法(例如从 GetParsedEntity 抛出异常),测试将继续正确通过,但客户端代码可能会因为此更改而失败。

在这种特殊情况下,我使用 C#、XUnit 和 Moq,但我认为这是一个更一般的测试问题。

最佳答案

The problem that I'm seeing with this approach is that, because the code is testing not only the test subject (the public method) but also the private methods, is not clear which should be the test result by looking at the test subject (public method).

您提到的测试对象在不知道其完整契约(Contract)的情况下没有明显的效果。这里的完整契约(Contract)是什么?提到的公共(public)方法 构造函数,它们具有依赖性。此处重要的是依赖关系,与此依赖关系的交互是应该测试的。私有(private)方法(一如既往)是实现细节 - 与单元测试无关

话虽如此,让我们回到契约(Contract)。测试对象的实际契约是什么(ChangeService 方法)?要根据某个 id 从存储库中检索对象,请创建不同的对象并将后者保存在同一存储库中。这是你的测试。

[Fact]
public void ChangeService_StoresNewEntityInRepository_BasedOnProvidedId()
{
const string ExpectedName = "some name";
var otherEntity = new OtherEntity { Name = ExpectedName };
var mock = new Mock<IRepository>();
var service = new ChangeService(mock.object);
mock.Setup(m => m.GetEntityById(0)).Return(otherEntity);

service.RegisterChange(0);

mock.Verify(m => m.SaveEntity(It.Is<Entity>(e => e.Name == ExpectedName));
}

关于c# - 依赖私有(private)方法测试公共(public)方法的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19411760/

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