c# - 将构造函数参数从接口(interface)类型转换为具体类类型在这里是错误的吗?

标签 c# unit-testing

给定以下类:

public interface ISession {}

public class Session : ISession
{
    internal Uri ServerUri { get; private set; } // not in interface obviously
}

现在我在同一个项目中有另一个依赖于 Session 的类:

public  interface IDataClass {}

internal DataClass : IDataClass
{
    private readonly Session _session;

    public DataClass(ISession session)
    {
        _session = (Session) session;
    }

    // some more methods that access the internal property _session.ServerUri
    // and call methods on the session object
    // ...
}

所以实际上 Session 类非常复杂。为了对 DataClass 进行单元测试,我将构造函数参数设置为 ISession,因此我能够模拟依赖关系并验证对 ISession 的某些方法调用模拟。

但是,DataClass 中的某些方法必须访问 _session.ServerUri 属性,因此该字段必须是 Session 类型比 ISession

我还可以创建 ISession 类型的字段,并在每次访问内部属性时强制转换该字段,这将使在这个特定位置更清楚为什么具体的 internal 甚至需要上课。

每次我以上述方式实现转换时,我都想知道是否可以通过更好的代码设计来避免转换。通常我会找到更好的方法并摆脱强制转换。

但是上面的例子呢?这是好的代码设计吗?或者有更清洁的方法吗?我只是觉得以上述方式从构​​造函数初始化字段很奇怪。

最佳答案

老实说,我认为您当前的系统不是一个好主意。

您的构造函数声明“只要它实现了 ISession,我就接受任何东西”,但这不是真的 - 调用代码可能很难发现这一点当他们在尝试创建 DataClass 实例时收到 InvalidCastException

所以你真的应该在 ISession 继承自 ISession 的接口(interface)中声明 ServerUri - 但是在任何一种情况下,您都需要通过接口(interface)仅在 DataClass

上声明(和存储)此依赖项

关于c# - 将构造函数参数从接口(interface)类型转换为具体类类型在这里是错误的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23789659/

相关文章:

C# Accord.net。文本分类

c# - 在不创建 'ResourceManager' 实例的情况下访问本地化资源字符串?

c# - 如何使用 Visual Studio Code 引用程序集?

c# - 为什么 C# Struct 与属性的行为不同? (与声明为字段相比)

java - 单元测试类的最佳实践,主要负责调用依赖项的方法,但也包含逻辑

unit-testing - 使用 MOQ 对象进行 ASP.NET MVC 单元测试

unit-testing - 对 Firebase : what's the "right way" to test/mock `transaction` s with sinon. js 的 Cloud Functions 进行单元测试

c# - 将模型属性作为参数传递给 Url.Action

java - 了解 Mockito 验证背后的语义

c# - 如何对 IEqualityComparer 进行单元测试?