我的服务设置如下:
public interface IMyService
{
void AddCountry(string countryName);
}
public class MyService : IMyService
{
public void AddCountry(string countryName)
{
/* Code here that access repository and checks if country exists or not.
If exist, throw error or just execute. */
}
}
test.cs中
[TestFixture]
public class MyServiceTest
{
[Test]
public void Country_Can_Be_Added()
{ }
[Test]
public void Duplicate_Country_Can_Not_Be_Added()
{ }
}
如何测试AddCountry
和moq存储库或服务。我真的不确定在这里做什么或者嘲笑什么。有人可以帮助我吗?
我正在使用的框架:
答案 0 :(得分:4)
为什么你需要使用moq?你不需要模拟IService。在您的情况下,您可以像这样编写测试:
[Test]
public void Country_Can_Be_Added()
{
new MyService().AddCountry("xy");
}
[Test]
public void Duplicate_Country_Can_Not_Be_Added()
{
Assert.Throws<ArgumentException>(() => new MyService().AddCountry("yx"));
}
如果你有这样的场景,你需要模拟IRepository:
interface IRepository { bool CanAdd(string country); }
class MyService : IService
{
private IRepository _service; private List<string> _countries;
public IEnumerable<string> Countries { get { return _countries; } }
public X(IRepository service) { _service = service; _countries = new List<string>(); }
void AddCountry(string x)
{
if(_service.CanAdd(x)) {
_conntires.Add(x);
}
}
}
这样的测试:
[Test]
public void Expect_AddCountryCall()
{
var canTadd = "USA";
var canAdd = "Canadd-a";
// mock setup
var mock = new Mock<IRepository>();
mock.Setup(x => x.CanAdd(canTadd)).Returns(false);
mock.Setup(x => x.CanAdd(canAdd)).Returns(true);
var x = new X(mock.Object);
// check state of x
x.AddCountry(canTadd);
Assert.AreEqual(0, x.Countires.Count);
x.AddCountry(canAdd);
Assert.AreEqual(0, x.Countires.Count);
Assert.AreEqual(0, x.Countires.Count);
Assert.AreEqual(canAdd, x.Countires.First());
// check if the repository methods were called
mock.Verify(x => x.CanAdd(canTadd));
mock.Verify(x => x.CanAdd(canAdd));
}
答案 1 :(得分:3)
您测试具体的MyService。如果它需要依赖(例如在IRepository上),您将创建该接口的模拟并将其注入服务。如上所述,测试服务不需要模拟。
创建IMyService接口的目的是单独测试依赖于MyService的其他类。一旦你知道Repository工作,你就不需要在测试MyService时测试它(你模拟或存根)。一旦您了解MyService的工作原理,就不需要在测试MySomethingThatDependsOnMyService时对其进行测试。