如何在没有依赖注入的情况下模拟我们在c#中测试的同一类的另一个方法
我面临一个场景,需要在c#中模拟同一类的另一个方法。但我面临的问题是嘲笑另一种方法和我在下面分享的方法如何在没有依赖注入的情况下模拟我们在c#中测试的同一类的另一个方法,c#,.net,unit-testing,automation,moq,C#,.net,Unit Testing,Automation,Moq,我面临一个场景,需要在c#中模拟同一类的另一个方法。但我面临的问题是嘲笑另一种方法和我在下面分享的方法 Interface --> public interface IFetch { string GetColorCodes(); string FetchData(); } Class--> public class Fetch : IFetch { public Fetch() { //I dont
Interface -->
public interface IFetch
{
string GetColorCodes();
string FetchData();
}
Class-->
public class Fetch : IFetch
{
public Fetch()
{
//I dont have any dependency injection
}
public string GetColorCodes() {
return "Yellow";
}
public string FetchData(){
string color= GetColorCodes();
return color;
}
现在,在为测试FetchData()方法创建单元测试时,我不希望它在内部调用GetColorCodes()方法并返回“Yellow”。我想返回一些其他颜色,如“红色”。
因为没有依赖项,方法在同一个类中,所以我无法找到方法。如果有人有想法,请与此示例代码共享
[TestFixture]
class FetchTest
{
[Test]
public void FetchDataTest()
{
Fetch obj=new Fetch();
string color= obj.FetchData();
Assert.IsEquals(color,"Red")
}
}
I want to mock the GetColorCodes() method from the test to Return Red color.
FetchData方法在此处没有任何依赖项。您不能模拟类的一部分来测试类的另一部分。您需要在此处引入一些依赖关系,例如:
public interface IColorProvider
{
string GetColor();
}
public class DefaultColorProvider : IColorProvider
{
public string GetColor => "Yellow";
}
public class Fetch : IFetch
{
private readonly IColorProvider _colorProvider;
public Fetch(IColorProvider colorProvider)
{
_colorProvider = colorProvider
}
public string FetchData(){
string color= _colorProvider.GetColor()
return color;
}
public class Fetch : IFetch
{
private readonly IColorProvider _colorProvider;
public Fetch(IColorProvider colorProvider)
{
_colorProvider = colorProvider
}
public string GetColorCodes() {
return _colorProvider.GetColor();
}
public string FetchData(){
string color= GetColorCodes();
return color;
}
在本例中,您有明确的依赖关系,可以模拟IColorProvider的行为并测试FetchData的行为
更新:
您可以这样做:
public interface IColorProvider
{
string GetColor();
}
public class DefaultColorProvider : IColorProvider
{
public string GetColor => "Yellow";
}
public class Fetch : IFetch
{
private readonly IColorProvider _colorProvider;
public Fetch(IColorProvider colorProvider)
{
_colorProvider = colorProvider
}
public string FetchData(){
string color= _colorProvider.GetColor()
return color;
}
public class Fetch : IFetch
{
private readonly IColorProvider _colorProvider;
public Fetch(IColorProvider colorProvider)
{
_colorProvider = colorProvider
}
public string GetColorCodes() {
return _colorProvider.GetColor();
}
public string FetchData(){
string color= GetColorCodes();
return color;
}
因此,类中的更改将非常小,但它将使您能够测试这一点。如果您在使
GetColorCodes()
虚拟化方面没有问题,那么您可以使用测试模式。在测试中,使用您希望使用的模拟值新建FetchStub,并在测试下从同一实例调用您的方法FetchData:
public class FetchStub : Fetch
{
private readonly string _colorCode;
public FetchStub(string colorCode)
{
_colorCode = colorCode;
}
public override string GetColorCodes()
{
return _colorCode;
}
}
public class Fetch
{
public Fetch()
{
//I dont have any dependency injection
}
public virtual string GetColorCodes()
{
return "Yellow";
}
public string FetchData()
{
string color = GetColorCodes();
return color;
}
}
问题是这是一个现有的类,它有几个方法,我无法为GetColor()创建接口方法您可以尝试使用TypeMock隔离器对现有代码进行处理,它有很多方法来模拟方法甚至实例方法,但我不确定这是否是一种好的做法。这就是模拟的问题:您需要测试代码。你决定用嘲弄。现在你有两个问题。这在无约束的隔离框架中是可能的,比如TypeMock或JustMock(两者都是付费的)和MS Fakes。您使用什么隔离框架?这似乎是一个。目前的问题也不完整,因此不清楚。阅读并编辑问题,提供可用于重现问题的答案,以便更好地理解实际提出的问题。如果原始方法始终返回“黄色”,为什么需要测试“红色”?