Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Moq,我如何模拟一个方法来改变作为参数的流?_C#_Unit Testing_Devexpress_Moq - Fatal编程技术网

C# 使用Moq,我如何模拟一个方法来改变作为参数的流?

C# 使用Moq,我如何模拟一个方法来改变作为参数的流?,c#,unit-testing,devexpress,moq,C#,Unit Testing,Devexpress,Moq,我正在尝试测试以下方法: public void SaveDashboardToPersistentDashboard( Dashboard dashboard, PersistentDashboard persistentDashboard) { using (MemoryStream stream = new MemoryStream()) { dashboard.SaveToXml(stream); persistentDashboa

我正在尝试测试以下方法:

public void SaveDashboardToPersistentDashboard(
    Dashboard dashboard, PersistentDashboard persistentDashboard)
{
    using (MemoryStream stream = new MemoryStream())
    {
        dashboard.SaveToXml(stream);
        persistentDashboard.Definition = stream.ToArray();

        persistentDashboard.Name = dashboard.Title.Text;
        _unitOfWork.CommitChanges();
    }
}
该方法使用DevExpress仪表板,调用
SaveToXml
(传入
MemoryStream
),然后将流数组写入
PersistentDashboard
POCO的
定义
属性

我无法控制Dashboard类,但希望模拟
SaveToXml
方法,将Dashboard方法行为从测试中排除。这将涉及获取内部流并将已知字节数组写入其中

我是Moq新手,无法确定如何更改传递到SaveToXml的流的内容-至少在不将流传递到
SaveDashboardToPersistentDashboard
方法的情况下。流是该方法行为的附带部分,因此我并不特别喜欢将其作为参数传递


有什么方法可以实现我的目标吗?

这是您的设计问题。不使用您使用的模拟库

如果您希望代码是可测试的,那么直接访问框架通常是个坏主意。这甚至包括.NET框架本身。虽然使用
DateTime
通常是安全的,但使用
File
已经成为一种巨大的痛苦

我建议为您使用的
DevExpress
类创建包装器类。然后从中提取您在业务逻辑中使用的接口。你可以在测试中模仿它们,那没问题

诸如此类:

public interface IDashboard
{
    void SaveToXml(Stream stream);
}

public class DashboardWrapper : IDashboard
{
    private readonly Dashboard dashboard = new Dashboard();

    public void SaveToXml(Stream stream)
    {
        this.dashboard.SaveToXml(stream);
    }
}
您可以使用抽象工厂或IoC容器来创建这些包装器


ETA:不确定这些
仪表板
对象是如何实例化的。或者,为包装器提供一个构造函数,该构造函数接受
仪表板
实例,并为使用该构造函数的隐式转换实现一个
运算符。

这是您的设计中的一个问题。不使用您使用的模拟库

如果您希望代码是可测试的,那么直接访问框架通常是个坏主意。这甚至包括.NET框架本身。虽然使用
DateTime
通常是安全的,但使用
File
已经成为一种巨大的痛苦

我建议为您使用的
DevExpress
类创建包装器类。然后从中提取您在业务逻辑中使用的接口。你可以在测试中模仿它们,那没问题

诸如此类:

public interface IDashboard
{
    void SaveToXml(Stream stream);
}

public class DashboardWrapper : IDashboard
{
    private readonly Dashboard dashboard = new Dashboard();

    public void SaveToXml(Stream stream)
    {
        this.dashboard.SaveToXml(stream);
    }
}
您可以使用抽象工厂或IoC容器来创建这些包装器


ETA:不确定这些
仪表板
对象是如何实例化的。或者,为包装器提供一个构造函数,该构造函数接受
仪表板
实例,并为使用该构造函数的隐式转换实现一个
运算符。

这是您的设计中的一个问题。不使用您使用的模拟库

如果您希望代码是可测试的,那么直接访问框架通常是个坏主意。这甚至包括.NET框架本身。虽然使用
DateTime
通常是安全的,但使用
File
已经成为一种巨大的痛苦

我建议为您使用的
DevExpress
类创建包装器类。然后从中提取您在业务逻辑中使用的接口。你可以在测试中模仿它们,那没问题

诸如此类:

public interface IDashboard
{
    void SaveToXml(Stream stream);
}

public class DashboardWrapper : IDashboard
{
    private readonly Dashboard dashboard = new Dashboard();

    public void SaveToXml(Stream stream)
    {
        this.dashboard.SaveToXml(stream);
    }
}
您可以使用抽象工厂或IoC容器来创建这些包装器


ETA:不确定这些
仪表板
对象是如何实例化的。或者,为包装器提供一个构造函数,该构造函数接受
仪表板
实例,并为使用该构造函数的隐式转换实现一个
运算符。

这是您的设计中的一个问题。不使用您使用的模拟库

如果您希望代码是可测试的,那么直接访问框架通常是个坏主意。这甚至包括.NET框架本身。虽然使用
DateTime
通常是安全的,但使用
File
已经成为一种巨大的痛苦

我建议为您使用的
DevExpress
类创建包装器类。然后从中提取您在业务逻辑中使用的接口。你可以在测试中模仿它们,那没问题

诸如此类:

public interface IDashboard
{
    void SaveToXml(Stream stream);
}

public class DashboardWrapper : IDashboard
{
    private readonly Dashboard dashboard = new Dashboard();

    public void SaveToXml(Stream stream)
    {
        this.dashboard.SaveToXml(stream);
    }
}
您可以使用抽象工厂或IoC容器来创建这些包装器

ETA:不确定这些
仪表板
对象是如何实例化的。或者,为包装器提供一个构造函数,该构造函数接受
仪表板
实例,并为使用该构造函数的隐式转换实现一个
操作符