2013-09-02 2 views
1

Привет, я создаю макетный объект, где каждый раз, когда вызывается метод GetPath, я получаю итерацию. Вот мой блок кода тестирования:Moq Значение обратного вызова не изменяется, когда обратный вызов вызван

string fileSharePath = "/fileSharePath/"; 
int i = 0; 
m_FileShareDocumentPathProvider.Setup(p => p.GetPath(It.IsAny<IFileShareDocument>()))          
           .Callback(() => 
            { 
             i++; 
             fileSharePath += i; 
            }) 
           .Returns(fileSharePath); 

Вот код в ведьму GetPath получить называеться:

foreach (var document in documents) 
{ 
    string filePath = GetFilePath(document); 
    fileSharePaths.Add(filePath); 
    documentsDictionary.Add(document, filePath); 
} 

private string GetFilePath(IFileShareDocument document) 
{ 
    var fileShareDocumentPathProvider = m_FileShareDocumentPathProviderFactory.GetFilePathProvider(document); 
    var filePath = fileShareDocumentPathProvider.GetPath(document); 
    return filePath; 
} 

При отладке я замечаю значение FileSharePath не меняется, как и ожидалось, он остается тем же ,

Что я делаю неправильно?

EDIT:

m_FileShareDocumentPathProviderFactory.Setup(f => f.GetFilePathProvider(It.IsAny<IFileShareDocument>())) 
               .Returns(m_FileShareDocumentPathProvider.Object); 
+1

Вы настроили 'm_FileShareDocumentPathProviderFactory.GetFilePathProvider', чтобы фактически вернуть правильный mock-объект (' m_FileShareDocumentPathProvider')? – sloth

+0

Да, я его настроил – aleczandru

ответ

7

Вам нужно изменить Returns(fileSharePath) к Returns(()=>fileSharePath). Когда вы вызываете Returns, он передает fileSharePath по значению, поэтому значение никогда не изменяется. Вы должны передать его в качестве делегата, что заставляет Moq выполнять эту функцию каждый раз, когда она «возвращает» значение.

Фактически вы можете сократить код, исключив Callback и просто сделав .Returns(() => fileSharePath += ++i). Вам редко приходится использовать как Callback, так иReturns для одной функции. Callback Функция «mock выполняет» a void и Return «mock выполняет» функцию с возвращаемым значением, а затем возвращает это значение.

+0

Огромное спасибо! – sjclark76

Смежные вопросы