Добро пожаловать в StackOverflow!NSubstitute будет работать только с экземплярами, которые вы создаете с помощью Substitute.For<T>
.Таким образом, вы можете использовать When..Do
, Returns
, Received
и т.д. с context
(создание с использованием NSubstitute), но не countrybLL
(создание с использованием new CountryBLLService
).
Попробуйте вместо этого использовать насмешку с помощью context
:
[TestMethod]
[ExpectedException(typeof(Exception),"Country Alreday exist")]
public void CreateContry_throwEx()
{
var existingCountry = new Country();
context.Countries
.When(x => x.CreateCountry(existingCountry))
.Do(x => { throw new Exception(); });
// Or context.Contries.CreateCountry(...).Returns(...) for non-void member
countrybLL.CreateCountry(existingCountry);
}
Кроме того, когда я сталкиваюсь с подобными проблемами в своих тестах, иногда я считаю полезным не использовать насмешкурамки, и вместо этого вручную создайте замену зависимости, которую использует мой класс.Это то, что NSubstitute и другие библиотеки-насмешки делают для нас автоматически, но это может помочь точно выделить то, что я тестирую, и то, что я подделываю для своего теста.
Например:
class CountryExistsRepository : ICountryRepository {
public void CreateCountry(Country c) {
throw new Exception("country already exists");
}
// ... other members omitted ...
}
[TestMethod]
[ExpectedException(typeof(Exception),"Country already exist")]
public void CreateContry_throwEx()
{
var existingCountry = new Country();
var countrybLL = new CountryBLLService(
new TimeSeetContext(new CountryExistsRepository()));
countrybLL.CreateCountry(existingCountry);
}
Я считаю, что это делает более понятным, какой именно код я использую, по сравнению с тем, что я подделываю для теста.Затем, когда мне надоело реализовывать эти случаи вручную, я переключаюсь на насмешливую библиотеку, чтобы сделать это для меня.В этом случае это показывает, что, возможно, нам не нужно заменять TimeSeetContext
, только на базовый ICountryRepository
.
Надеюсь, это поможет.