C# 如何测试从Console.ReadLine读取的线程,即如何写入Console';谁的输入?

C# 如何测试从Console.ReadLine读取的线程,即如何写入Console';谁的输入?,c#,unit-testing,C#,Unit Testing,我有一个线程可以通过console.ReadLine从控制台读取数据,但为了为该线程构建单元测试,我想基本上写入控制台的输入,我尝试了以下方法: Stream inputStream = Console.OpenStandardInput(); StreamWriter sw = new StreamWriter(inputStream); sw.WriteLine("foo"); 但是线程没有看到文本?还有别的办法吗?我想你需要在这个问题上后退一步。您所做的是将应用程序耦合到控制台。而你真的

我有一个线程可以通过console.ReadLine从控制台读取数据,但为了为该线程构建单元测试,我想基本上写入控制台的输入,我尝试了以下方法:

Stream inputStream = Console.OpenStandardInput();
StreamWriter sw = new StreamWriter(inputStream);
sw.WriteLine("foo");

但是线程没有看到文本?还有别的办法吗?

我想你需要在这个问题上后退一步。您所做的是将应用程序耦合到控制台。而你真的应该把它分开。。。下面是一些伪代码:

您的应用程序

public interface IUserInput
{
    string ReadInput();
}

public class ConsoleInput : IUserInput
{
    public ReadInput()
    {
        return Console.ReadLine();
    }
}

public class YourClass
{
    IUserInput _userInput;

    // Can inject TEST or REAL input
    public YourClass(IUserInput userInput)
    {
        _userInput = userInput;
    }

    // ... Your code
    public void YourMethod()
    {
        var doSomething = _userInput.ReadInput();
    }
}
您的测试

public class TestInput : IUserInput
{
    public ReadInput()
    {
        return "This is dummy data";
    }
}

[Test]
public void MyTest()
{
    var testInput = new TestInput();
    var systemUnderTest = new YourClass(testInput);
    // ...
}

我认为你需要在这个问题上后退一步。您所做的是将应用程序耦合到控制台。而你真的应该把它分开。。。下面是一些伪代码:

您的应用程序

public interface IUserInput
{
    string ReadInput();
}

public class ConsoleInput : IUserInput
{
    public ReadInput()
    {
        return Console.ReadLine();
    }
}

public class YourClass
{
    IUserInput _userInput;

    // Can inject TEST or REAL input
    public YourClass(IUserInput userInput)
    {
        _userInput = userInput;
    }

    // ... Your code
    public void YourMethod()
    {
        var doSomething = _userInput.ReadInput();
    }
}
您的测试

public class TestInput : IUserInput
{
    public ReadInput()
    {
        return "This is dummy data";
    }
}

[Test]
public void MyTest()
{
    var testInput = new TestInput();
    var systemUnderTest = new YourClass(testInput);
    // ...
}

我实际上使用了这种方法:StreamReader sr=newstreamreader(“multile1.txt”);控制台设置(sr);成功了!我实际上使用了这种方法:StreamReader sr=newstreamreader(“multile1.txt”);控制台设置(sr);成功了!