Одной из основных проблем, которые вы затрагиваете, является назначение preloadImages[r]
для new Image()
, а не Array
. Кроме того, вы определяете preloadImages
как функцию и переменную (неявную глобальную) для использования в вашем двумерном Array
. После переименования этих переменных и небольшой очистки ваш код работает нормально, как показано ниже:
document.addEventListener('DOMContentLoaded', function () {
var queryData = [
'https://makelin.us/100/100',
'https://makelin.us/100/100',
'https://makelin.us/100/100'
];
var preloadImages = [];
// First function to preload image slices into a two dimensional array.
function preloadAllImages() {
var row = 5;
var col = 5;
for (var r = 0; r < row; r++) {
preloadImages[r] = [];
for (var c = 0; c < col; c++) {
preloadImages[r][c] = new Image();
preloadImages[r][c].src = queryData[2];
}
}
// console.log(preloadImages);
}
preloadAllImages();
// Second function to retrieve and assemble image slices.
function assembleImage() {
var row = 5;
var col = 5;
var assembleImage = document.getElementById("prodImage");
var imageTable = "<table>";
for (var r = 0; r < row; r++) {
imageTable += "<tr>";
for (var c = 0; c < col; c++) {
imageTable += "<td>";
imageTable += "<img src=" + preloadImages[r][c].src + "/>";
imageTable += "</td>";
// console.log(preloadImages[r][c])
}
imageTable += "</tr>";
}
imageTable += "</table>";
// console.log(imageTable);
assembleImage.innerHTML = imageTable;
// console.log(assembleImage);
}
assembleImage();
});
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>repl.it</title>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="prodImage"></div>
<script src="script.js">
</script>
</body>
</html>
Я записал адаптеры для помех System.IO.File
и Directory
методы. Затем в моих классах я делаю следующее:
public class MyService {
public IFile File {private get;set;}
public MyService() {
File = new FileImpl();
}
public void DoSomething() {
File.ReadAllText("somefile");
}
}
Затем можно ввести насмешку как IFile для тестирования.
Хорошо, у меня нет ложной файловой системой библиотеки, которой Вы желаете для (хотя это может быть там где-нибудь и было бы прохладно), но это может помочь. Одно из интересных понятий, "бихевиористская" школа поблочного тестирования думала, придумало, идея "исходящего интерфейса". В некоторых случаях, кажется, существует столько же значения в принятии вызовов, которые объект выполняет ко всей вселенной вещей за пределами себя и превращению их в интерфейс, поскольку существует в типичном действии создания интерфейса для методов, внешний мир может обратиться к Вашему объекту).
В этом случае Вы могли бы рассмотреть, вместо того, чтобы дразнить целую файловую систему, делая один или несколько логически когерентных интерфейсов для ответов и обслуживаете свои объектные потребности от внешнего мира. Вызовы просто ответили бы на вопросы, в которых Вы нуждаетесь, ответил... не, диктуют реализацию. Затем можно использовать внедрение зависимости, как Вы упомянули для введения в реализации, Вы требуете для своих тестов. И Вы будете, вероятно, использовать Moq, чтобы сделать так, так как Вы знакомы с ним.
Так, Ваш "исходящий интерфейс" мог бы иметь метод под названием DoesFileExist (). Это могло бы принять путь. Или, если существует "высокоуровневый" бизнес-вопрос, Ваш объект пытается ответить и видит, существует ли файл, просто способ, которым на вопрос отвечают, затем Ваш исходящий интерфейс не мог бы иметь метода о существовании файла вообще. Это могло бы вместо этого быть что-то как "DoIAppearToHaveAccessToTheFileServer" или даже "IsThereAPreviouslySavedGame".
Это - некоторая работа, но могло бы быть более верно для принципов хорошего поблочного тестирования... позволяет Вашему объекту под тестом выразить то, что это пытается сделать и позволить Вашим модульным тестам протестировать его и только его. Просто мысль... надеется, что помогает.
Я понимаю, что пакет Typemock может сделать вещи как это.
Вместо того, чтобы дразнить интерфейс файловой системы, я традиционно решил бы дразнить саму Файловую систему. Это - относительно легкая задача на любой серьезной ОС. Можно создать файловую систему пространства пользователя очень легко с Моно. Предохранитель, реализация C# FUSE, Файловых систем в Пространстве пользователя. Я не уверен, что, если какое-либо портирование потребовалось бы, чтобы получать Dokan, FUSE для Windows, но FUSE хорошо работает на Linux, OSX и Солярисе.
Я поддерживаю проект Jolt.NET на CodePlex, который содержит библиотека для создания таких интерфейсов и их реализаций для вас. Пожалуйста, обратитесь к библиотеке Jolt.Testing для получения дополнительной информации.