Scyldshefing
Я бы согласился, что представленный тест не тестирует метод void. Он даже не проверяет, что ожидаемое исключение возникает, когда возникает определенное условие. Все, что он делает, это проверяет, что что-то работает и не создает исключения. Метод Void можно протестировать, но вам нужно будет посмотреть на использование насмешливого фреймворка и какой-то формы внедрения зависимостей. В TDD вы должны разрабатывать тест перед созданием кода, и поэтому тест определяет, что должен делать код.
Вот образец тестируемого метода void:
/// <summary>
/// Creates the model.
/// </summary>
/// <param name="activityId">The activity identifier.</param>
/// <param name="documentModel">The document model.</param>
/// <exception cref="NotImplementedException"></exception>
public void CreateModel(string activityId, string documentModel)
{
this.UpdateModel(activityId, documentModel);
}
он использует следующий частный метод:
/// <summary>
/// Updates the model.
/// </summary>
/// <param name="activityId">The activity identifier.</param>
/// <param name="documentModel">The document model.</param>
public void UpdateModel(string activityId, string documentModel)
{
FlattenedActivityModel activityModel = null;
IAzureContainer azureContainer = ClassContainer.Resolve<IAzureContainer>();
IPublishActivityEvents publisher = ClassContainer.Resolve<IPublishActivityEvents>();
var searchQuery = string.Format(CultureInfo.CurrentCulture, "activityId:{0}", activityId);
var activityModels = azureContainer.ActivitySearch(string.Empty, searchQuery);
if (activityModels != null)
{
if (activityModels.Count > 0)
{
activityModel = activityModels[0];
}
}
FlattenedDocumentModel model = new FlattenedDocumentModel(activityModel, documentModel);
var metadata = JsonConvert.SerializeObject(model);
publisher.PublishDocumentMetadata(metadata, activityModel.RootName, model.MetadataFileName);
}
Один из тестов для проверки кода будет выглядеть следующим образом:
[TestMethod]
public void When_CreateModel_Is_Called_Then_Model_Is_Created_As_Expected()
{
var activityContent = File.ReadAllText(@"TestData\FlattenedActivity.json");
var activity = JsonConvert.DeserializeObject<FlattenedActivityModel>(activityContent);
var documentRequest = File.ReadAllText(@"TestData\DocumentRequest.json");
var activityId = Guid.NewGuid().ToString();
var document1 = new FlattenedDocumentModel
{
DocumentId = Guid.NewGuid().ToString(),
ActivityId = activityId
};
var documents = new Collection<FlattenedDocumentModel>
{
document1
};
var azureConatiner = new Mock<IAzureContainer>();
var activities = new Collection<FlattenedActivityModel>();
activity.ActivityId = activityId;
activities.Add(activity);
//get the activity
var queryString = string.Format("activityId:{0}", activityId);
azureConatiner.Setup(a => a.ActivitySearch(string.Empty, queryString)).Returns(activities);
var publishActivityEvents = new Mock<IPublishActivityEvents>();
// Register the components to the IOC container
ClassContainer.InitialiseRegistrations();
ClassContainer.RegisterInstance(azureConatiner.Object);
ClassContainer.RegisterInstance(publishActivityEvents.Object);
var target = new DocumentApi();
target.UpdateModel(activityId, documentRequest);
FlattenedDocumentModel expectedModel = new FlattenedDocumentModel(activity, documentRequest);
var expectedMetadata = JsonConvert.SerializeObject(expectedModel);
azureConatiner.Verify(a => a.ActivitySearch(string.Empty, queryString), Times.Once());
publishActivityEvents.Verify(p => p.PublishDocumentMetadata(expectedMetadata, activity.RootName, expectedModel.MetadataFileName));
}
Этот тест проверяет, что внутренние компоненты метода void выполняют ожидаемые вызовы с ожидаемыми значениями и ожидаемым количеством раз.(Я хотел бы отметить, что этот образец является НЗП и имеет некоторые проблемы, которые нуждаются в дальнейших тестах, например activityModel является нулевым).