javascript - Läs värde som loggats till konsolen i Deno


Hur kan jag läsa ett värde som loggats till konsolen i Deno? Jag försöker skriva ett test som kontrollerar om en funktion loggar rätt värde till konsolen.

Jag har redan provat detta, men det kan bara läsa värden som matas in manuellt i stdin. Hämtar värden från Deno stdin

Svar #1

Detta är en riktigt gammal fråga, men jag råkade stöta på den när jag försökte lösa något liknande. Jag slutade med att använda Denos inbyggda mocking för att sätta upp en spion i ett test och kontrollera att console.log kallades med det förväntade värdet.

import {
  assertSpyCall,
  spy,
} from "https://deno.land/[email /testing/mock.ts";

function veryImportantLogger(val: string) {
  console.log(val)
}

Deno.test("Checks to make sure the right value is logged", () => {
  const logSpy = spy(console, "log");
  const logValue = "well hello there";
  veryImportantLogger(logValue);

  assertSpyCall(logSpy, 0, {
    args: [logValue]
  });
});

Svar #2

Detta är mer av en lösning på hacknivå men fungerar i mitt fall

class BinarySearchTree<T> {
// ...
inOrderPrint() {
    if (this.left) {
      this.left.inOrderPrint();
    }
    console.log(this.value);
    if (this.right) {
      this.right.inOrderPrint();
    }
  }
// ...
}


test("BST: should print elements in order", () => {
  let a = [];
  const log = console.log;
  console.log = x => {
    a.push(x);
  };
  const bst = new BinarySearchTree<number>(1);
  bst.insert(8);
  bst.insert(5);
  bst.insert(7);
  bst.insert(6);
  bst.insert(3);
  bst.insert(4);
  bst.insert(2);
  bst.inOrderPrint();
  console.log = log;
  assertEquals(a.join(""), "12345678");
});