gpt4 book ai didi

c# - 如何在 setter c# 中测试私有(private)方法

转载 作者:行者123 更新时间:2023-11-28 21:23:43 25 4
gpt4 key购买 nike

我在测试期间遇到问题。我有一个类似这些的类和属性

 public class ViewModel {

....

public string Person
{
get
{
return _person;
}
set
{
if (_person != value)
{
_person = value;
RefreshStrategy();
OnPropertyChanged();
Somefield = string.Empty;
}
}
}

public BindingList<string> Strategies
{
get
{
return _lstStrategies;
}
}

现在,RefreshStrategy 是一个包含多个其他对象的巨大方法,它从数据库中获取一些策略并根据所选人员更新 _lstStrategies。现在一切在运行时都运行良好,但是当我尝试测试它时,我遇到了一个问题:

[TestClass]
public class ViewModelTest
{

private ViewModel _viewobj;

public ViewModelTest()
{

_viewobj = new ViewModel();
}


[TestMethod]
public void TestStrategies()
{
_viewobj.Person = "Test";

Assert.AreEqual("AAAA", _viewobj.Strategies[0]);

}

private void RefreshStrategies()
{
Logger.log(Logger.INFO, $"GOT STRATEGIES");
// Reload these default options every time the form loads, in case some applications settings have been changed
if (String.IsNullOrEmpty(Trader) && !SettingsMgr.IsCompositePortfolio)
{
Person = Utility.SettingsMgr.PORTFOLIO_CODE;
}
if (!String.IsNullOrEmpty(Person))
{

string fund = _portfolios.Where((tt) => tt.PersonId == Person).Select(tt => tt.Fund).FirstOrDefault();
if (!string.IsNullOrEmpty(fund))
{
fund = "X";
}
var profitCenters = new List<ProfitCenter>();
try
{
Logger.log(Logger.INFO, $"Try to load strategies for {Person} {fund}");

var pci = DataMgr.getInstance().GetProfitCenterInfo(Person, fund);
Logger.log(Logger.INFO, $"HERE !!!");
profitCenters = pci?.profitCenters;

}
......

}

当我设置 Person = "Test" 时,显然 RefreshStrategy() 被调用但内部所有对象都是 null 并且它引发异常“...attempt to dereference空对象引用”。开头的简单 Logger 正在提升,如果我将其注释掉 Utility.Setting 正在重新调整等等

如果我在这个类上做一个简单的测试,比如测试一个简单的变量通过,这告诉我测试项目中的所有引用都很好。

我做错了什么?我要模拟整个方法吗?如果是,如果它是私有(private)的怎么办?

最佳答案

这是一种方法:

public interface IStrategyManager 
{
void RefreshStrategy();
}
public class StrategyManager : IStrategyManager
{
public void RefreshStrategy()
{
// Doesn't matter what is in here.
}
}
public class ViewModel {
public IStrategyManager StrategyManager = new StrategyManager();

public string Person
{
get
{
return _person;
}
set
{
if (_person != value)
{
_person = value;
StrategyManager.RefreshStrategy();
OnPropertyChanged();
Somefield = string.Empty;
}
}
}
}

你只需要模拟这个属性:

private ViewModel _viewModel;

[Test]
public void Test()
{
_viewModel = new ViewModel
{
StrategyManager = new Mock<IStrategyManager>().Object,
Person = "whatever"
};

}

当然,使用Dependency Injection 效果会更好,但我不知道您是否在使用它。然后你可以用构造函数注入(inject)替换属性。

这还允许您拥有 IStrategyManager 的不同实现,这很好。这种方法的弱点是额外的类和接口(interface)。

关于c# - 如何在 setter c# 中测试私有(private)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46102177/

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