gpt4 book ai didi

c# - 如何创建一个接口(interface),在 C# 中保留一些内部方法进行测试?

转载 作者:太空狗 更新时间:2023-10-29 19:54:54 25 4
gpt4 key购买 nike

考虑下面的类

public class Entity {
public void Foo() { ... }
internal void Bar() { ... }
}

如您所见,它有一个public 方法和一个internal 方法。现在,我想创建一个接口(interface),允许我在测试中模拟这个类(在这个程序集中和其他程序中)。我重写了我的代码如下:

public interface IEntity {
void Foo();
}

internal class Entity : IEntity {
public void Foo() { ... }
public void Bar() { ... }
}

但是,这会产生另一个问题。在同一程序集中的另一个方法中使用该类时,我不能再调用 Bar 了:

public class OtherClass {
public void SomeMethod(IEntity entity) {
entity.Bar(); // error!
}
}

重写代码如下:

public class OtherClass {
public void SomeMethod(IEntity entity) {
(entity as Entity).Bar(); // error in test!
}
}

会在触发SomeMethod的单元测试中触发错误。如何重写我的代码,以便我仍然可以在同一个程序集中使用 internal 方法,但只向其他程序集公开公共(public)成员?

更新: OtherClass 类是一个实用类,需要对Entity 类的内部进行操作,不向用户公开直接地。但是,此类本身对用户公开,因此他们可以间接访问 Entity 的内部。这是需要的,因为 SomeMethod 将执行必要的检查以确保用户不会搞砸 Entity 对象的内部状态。

最佳答案

How do I rewrite my code so that I can still use internal methods in the same assembly and yet only expose public members to other assemblies?

将接口(interface)设为内部,然后显式实现它。

internal interface ITest
{
void Foo();
void Bar();
}

public class Thing : ITest
{
void ITest.Foo() { this.Foo(); }
void ITest.Bar() { this.Bar(); }
public Foo() { ... }
internal Bar() { ... }
}

所以现在公共(public)类 Thing 只有一个公共(public)方法 Foo。程序集外部的代码不能直接或通过转换为接口(interface)调用 Bar,因为 BarITest 都是内部的。

我注意到基类 必须至少与其派生类一样可见。不是这样的界面。很少有人知道这是合法的:

class C : C.I
{
private interface I {}
}

一个类可以实现一个只有它能看到的接口(interface)!这样做有点奇怪,但在某些情况下它是有道理的。

关于c# - 如何创建一个接口(interface),在 C# 中保留一些内部方法进行测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18943983/

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